【问题标题】:Iterating over an std::vector when vector size changes. (C++)当向量大小改变时迭代 std::vector。 (C++)
【发布时间】:2014-02-22 22:18:51
【问题描述】:

我写了一个非常简单的代码来遍历一个向量。问题是这个向量在每个迭代器上都会改变它的大小。

向量是类的私有变量。代码是这样的:

std::vector<boost::filesystem::path> headerVector;

循环是同一类的成员函数内的for循环。

似乎 for 循环读取了一次向量大小,然后迭代直到达到该数字,但向量在某些迭代中增加了它的大小(不是无限的)。

如何让它迭代直到 IT 的值和向量的当前大小相等?

代码如下:

void HeaderObtainer::mapIterator( boost::filesystem::path aPath )
{
    bool exist;
    std::vector<boost::filesystem::path>::iterator it; //iterator for boost path.

    for (it = headerVector.begin(); it!= headerVector.end(); it++) // For each?
        {
            aPath = *it;
            exist = HeaderSources::fileExists( aPath ); //Returns bool.
            fileSearch ( exist, aPath );
        }
}

谢谢!

【问题讨论】:

  • 添加元素后,向量的迭代器不一定有效。
  • 你的意思是有另一个线程正在修改你的向量headerVector你正在迭代它?
  • 你可以使用索引来代替iterator
  • @StephaneRolland:我认为fileSearch 可能会为headerVector 添加新路径。所以单线程。

标签: c++ vector iterator


【解决方案1】:

注意 std::vector 迭代器 might be invalidated,如果它的大小发生变化。因此,如果循环改变向量大小,您的代码会导致未定义的行为。

如果另一个线程更改了向量,也会出现未定义的行为,因为std::vector 不是线程安全的,所以你应该保护临界区(例如使用互斥锁)。

【讨论】:

    【解决方案2】:

    假设fileSearch 可以在headerVector 的末尾添加元素,但不能删除元素。 以下可能会有所帮助:

    void HeaderObtainer::mapIterator(boost::filesystem::path aPath)
    {
        for (std::size_t i = 0; i != headerVector.size(); ++i) {
            aPath = headerVector[i];
            bool exist = HeaderSources::fileExists(aPath); //Returns bool.
            fileSearch(exist, aPath);
        }
    }
    

    【讨论】:

    • 这无济于事,因为您不知道 哪里 插入了新元素(您假设它已附加,但 OP 没有说明)。所以,现在程序可能会做错事而不会崩溃。
    【解决方案3】:

    您可能会使用一段时间而不是 for 并动态管理迭代器。我认为使用上次迭代的迭代器副本,您可以在删除某些内容后返回到最后一个位置。或者,如果向量要小,只需在向量大小随it=headerVector.begin();变化时重新开始循环即可

    (实际上我不确定最后一个是否可行,因为矢量大小已更改,但我相信您可以稍等片刻)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2012-05-07
      • 1970-01-01
      • 2010-11-12
      • 2023-03-06
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多