我写了一个非常简单的代码,它迭代了一个向量。问题是这个向量在每个迭代器上改变了它的大小。
向量是类的私有变量。代码是这样的:
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 );
}
}
谢谢!
答案 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();
(实际上我不确定最后一个是否会起作用,因为矢量大小已经改变,但我确定你可以暂时这样做)