当矢量大小改变时,迭代std :: vector。 (C ++)

时间:2014-01-30 14:39:47

标签: c++ vector iterator

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

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

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

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

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

如何迭代,直到IT的值和向量的CURRENT大小相等为止?

代码如下:

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 );
        }
}

谢谢!

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:1)

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

如果另一个线程更改了向量,那么还有未定义的行为,因为std::vector不是线程安全的,所以你应该保护关键部分(例如使用互斥锁)。

答案 2 :(得分:0)

您可能会使用一段时间而不是动态管理迭代器。我认为使用上一次迭代的迭代器副本,你可以在删除之后返回到最后一个位置。或者,如果矢量很小,只需在矢量大小随it=headerVector.begin();

变化时重新启动循环。

(实际上我不确定最后一个是否会起作用,因为矢量大小已经改变,但我确定你可以暂时这样做)