【问题标题】:What is the past-the-end iterator in STL C++?STL C++ 中的结束迭代器是什么?
【发布时间】:2013-02-21 12:26:58
【问题描述】:

任何人都可以向我解释past-the-end 的含义。为什么我们称end() 函数为过去式?

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    从字面上看,因为它指向数组末尾的一个位置。

    使用它是因为该元素是空的,并且可以迭代,但不能取消引用。

    int arry[] = {1, 2, 3, 4, /* end */ };
                             ^^^^^^^
                        std::end(arry) would point here.
    

    【讨论】:

    • 不仅仅是数组; end 迭代器指向目标序列的末尾,而不管迭代器来自哪里或值保存在哪里。
    【解决方案2】:

    因为它不指向容器的last元素,而是指向过去容器的最后一个元素的某处。

    如果您取消引用end(),则会导致未定义的行为

    【讨论】:

      【解决方案3】:

      和数学中的区间一样,stl 使用[begin, end)

      这就是为什么我们可以写for (auto it = v.begin(); it != v.end(); ++it)

      【讨论】:

      • 是的!第一个不谈论容器的答案,容器不是创建序列所必需的。
      • [begin,end]也是如此;然后还有(a,b](a,b)。请详细说明,与其他区间相比,您在数学中看到 [a,b) 有什么特别之处?
      【解决方案4】:

      函数begin()end() 定义了一个半开范围([begin, end)),这意味着:
      该范围包括第一个元素但不包括最后一个元素。因此,名称超过了结尾。

      半开范围的优点是:

      1. 它避免了对空范围的特殊处理。对于空范围,begin() 等于 end().

      2. 它使迭代元素的循环的结束标准变得简单:循环简单 只要没有到达end(),就继续

      【讨论】:

      • 插图闻起来像 Josuttis :)
      • 不仅仅是begin()end();通常,[begin, end) 定义了一个值的序列,而不管迭代器来自哪里或值保存在哪里。
      • 3.范围内的元素数量是end - begin(用于随机访问迭代器),而不是带有令人讨厌的 +1 的表达式。
      【解决方案5】:

      对上述正确答案再补充一点。 这样做也是为了与数组兼容。 比如下面的代码:

      char arr[5];
      strcpy(arr, "eakgl");
      sort(&arr[0], &arr[5]);
      

      这会很好用。

      如果你给了:

      sort(&arr[0], &arr[4]);
      

      它会错过排序最后一个字符。

      这也有助于自然地表示空容器。

      【讨论】:

        猜你喜欢
        • 2021-08-19
        • 2011-08-22
        • 2019-04-19
        • 2010-11-06
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 2011-01-19
        • 1970-01-01
        相关资源
        最近更新 更多