C ++

C ++ Iterator失效规则中最受欢迎的帖子声称,不清楚过去最终迭代器(即由end()cend()rend()crend() )返回的迭代器是否根据与常规迭代器相同的规则,它指向容器中的元素。 针对2003年和2011年C ++制定的这些声明都遵循讨论End迭代器失效规则的帖子,其中接受的答案表明2003年的标准在这个问题上含糊不清。 这个结论是基于23.1 / 10中的一个评论(在swap() ),这似乎意味着当规范没有明确提到过时端迭代器的失效时,它们可能会失效。

对这个帖子的问题(mike-seymour)的评论表明C ++ 11在这个问题上是明确的,就deque 。 我的问题是关于所有容器:

  • 在C ++ 11中,是否有任何容器操作可能导致过去末端迭代器失效,以及语言规范中这种行为不明确的地方?
  • 换言之,

  • 在执行容器操作后,我能否相信过时末端迭代器的有效性,而不是说它可能会使过去末端迭代器失效?

  • 我的问题是关于所有容器:

  • 在C ++ 11中,是否有任何容器操作可能导致过去末端迭代器失效,以及语言规范中这种行为不明确的地方?
  • 我不确定你的意思是“在语言规范中这种行为是不明确的”,但肯定会有操作使顶过的操作符无效(如插入到std::vectorstd::string )。

    换言之,

  • 在执行容器操作后,我能否相信过时末端迭代器的有效性,而不是说它可能会使过去末端迭代器失效?
  • 您可以像任何其他迭代器一样信任过去端迭代器:任何不会(可能)使迭代器失效的操作不会使它们失效。 除了这个标准存在bug的可能性之外,所有的操作都不会说它们(可能)会使操作员失效。


    如果标准说操作不会使迭代器失效,你应该可以信任它。 其他任何应该被视为标准库实现中的错误。


    至少在GCC中,迭代器对std :: map无效:

    #include <set>
    #include <stdlib.h>
    #include <assert.h>
    int main() {
      std::set<int> a;
      a.insert(1);
      std::set<int>::reverse_iterator rit(a.rbegin());
      ++rit;
      assert(rit==a.rend());
      a.erase(a.begin());
      assert(a.rend()==rit); // FAIL
    }
    
    链接地址: http://www.djcxy.com/p/73325.html

    上一篇: c++

    下一篇: Problem with invalidation of STL iterators when calling erase