【问题标题】:c++: STL uses universal "end()" value for iterator?c++:STL 对迭代器使用通用的“end()”值?
【发布时间】:2012-06-18 14:36:04
【问题描述】:

给定 STL 容器的所有实例的“.end()”迭代器是否都指向同一个“past-the-end”对象?

例如

std::set<int> my_set_1;
// fill  "my_set_1"
std::set<int> my_set_2;
// fill  "my_set_2"

bool same_end_iterator  =       my_set_1.end() == my_set_2.end()    ; 

最后一行是否依赖于实现?

【问题讨论】:

    标签: c++ stl iterator


    【解决方案1】:

    给定 STL 容器的所有实例的“.end()”迭代器是否都指向同一个“past-the-end”对象?

    不,标准不能保证这一点,实际上某些容器类型可能不会那样工作。例如,std::vector::iterator 通常实现为指向数组元素的指针,end() 指向数组末尾。

    最后一行是否依赖于实现?

    最后一行给出了未定义的行为。您无法比较来自不同集合的迭代器 - 包括过去的迭代器。

    【讨论】:

    • 但我的问题是关于“.end()”迭代器的。所以你的回答基本上是:“不,因为它不是真的”,这是没用的。
    • @CycoMatto:Mike 的回答涵盖了一般情况,end() 的情况紧随其后。
    • @CycoMatto:对不起,如果我的回答对你来说太简短了。为了专门回答你的问题,我已经充实了一点。
    【解决方案2】:

    从概念上讲,每个容器有一个终端迭代器,并且将迭代器与不同容器(即使是相同类型的容器)进行比较是 UB。

    事实上,对于老派数组,off-the-end 迭代器是a+N,其中a 是数组的基数,N 是其中元素的数量,这意味着不同的off-the -end 不同数组的迭代器。这也是我能想到的对std::vector::iterator 最明智的实现。

    【讨论】:

    • 这对于“老式数组”来说是正确的概念,但对于 STL 容器则不一定如此。虽然使用“过去式”比喻可能对我们的直觉很有吸引力,但没有迹象表明这对于 STL 容器来说是现实(尤其是在vector 之外)。
    • @CycoMatto:我在第一句话中谈到了一般情况。每个容器有一个终端迭代器;一个实现可以选择对某种类型的所有容器使用相同的值,但你不能依赖它。
    【解决方案3】:

    据我所知,属于不同容器的迭代器的比较是未定义的,我不记得是哪个。这反而意味着给定std::vector&lt;int&gt; foo, barfoo.end()bar.end() 不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多