2014-01-30 99 views
0

我写了一个非常简单的代码,它遍历一个向量。问题是这个向量在每个迭代器上改变其大小。当矢量大小发生变化时,对std :: vector进行迭代。 (C++)

的载体是一类的专用变量。代码如下所示:

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

谢谢!

+1

迭代器的载体不一定有效。 – JoshG79

+1

你的意思是有*另一个*线程修改你的矢量'headerVector' **而你正在迭代它? –

+0

你可以使用索引来代替'iterator'。 – Jarod42

回答

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

它的工作原理; D。谢谢!! –

+0

这将无济于事,因为您不知道哪里插入了新元素(您认为它已被添加,但OP没有声明)。所以,现在这个程序可能会做错事情而不会崩溃。 –

1

注意std::vector迭代might be invalidated,如果它的大小变化。所以,如果循环改变了向量大小,你的代码会导致未定义的行为。

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

0

你也许可以使用一段时间,而不是为和动态管理迭代器。我认为,使用上一次迭代的迭代器副本,可以在删除某些内容后返回到最后一个位置。或者,如果矢量将变小,只需重新启动循环,当矢量的大小改变时it=headerVector.begin();

(其实我不确定最后一个因为矢量大小发生变化而工作,但我相信你可以用一个,而做到这一点),你添加元素后