c – 使用迭代器为std :: vector添加自己的元素

下面的代码按预期工作(测试通过)但我想知道如果以这种方式使用迭代器被认为是c中的坏习惯或者它是否正常.

也许这是std :: vector特有的,其他集合表现不同,最佳实践在集合(甚至是它们的实现)之间有所不同?

在其他语言中肯定不行,并且大多数情况下更改集合将使迭代器无效并抛出异常.

BOOST_AUTO_TEST_CASE (ReverseIteratorExample) {
    std::vector<int> myvector;
    for(int i = 0; i < 5; i++)
    {
        myvector.push_back(i);
    }

    // is this generally a bad idea to change the vector while iterating?
    // is it okay in this specific case?
    myvector.reserve(myvector.size() + myvector.size() - 2 );
    myvector.insert(myvector.end(),myvector.rbegin() + 1,myvector.rend() -1);

    int resultset [8] = { 0,1,2,3,4,1 };
    std::vector<int> resultVector( resultset,resultset + sizeof(resultset)/sizeof(resultset[0]) );
    BOOST_CHECK_EQUAL_COLLECTIONS(myvector.begin(),myvector.end(),resultVector.begin(),resultVector.end());
}

总结问题:

>迭代时更改向量通常是个坏主意吗?
>在这种特殊情况下可以吗?
>这是否特定于std :: vector和其他集合的行为有所不同?
>集合(甚至是它们的实现)之间的最佳实践有所不同吗?

解决方法

这不是有效的代码.标准对序列容器操作的定义说明(23.2.3@4):

a.insert(p,i,j) – […] pre: i and j are not iterators into a.

因此,您的代码调用未定义的行为,因为它违反了插入操作的前提条件.

如果不是使用insert,而是编写了一个循环,从myvector.rbegin()1迭代到myvector.rend() – 并在所有值上调用push_back,您的代码将是有效的:这是因为如果重新分配,push_back只会使向量迭代器失效需要,你的保留电话确保不是这种情况.

通常,虽然在某些情况下修改容器并在迭代它时很好(例如上面描述的循环),但是必须确保迭代器在执行此操作时不会失效.发生这种情况时,每个容器都是特定的.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...