【发布时间】:2011-12-06 16:09:53
【问题描述】:
我迷路了:std::string 向量的迭代器完美运行,除非在它之前有函数调用 (Z_UB->set() )++。代码如下:
std::vector< std::string >::iterator it = g_SPP.scenarios->getVector().begin();
std::cout << "begin of vector: " << *it << std::endl;
Z_UB->set("s1", "scn2", 350);
it++;
std::cout << "second of vector: " << *it << std::endl;
创建以下输出
begin of vector: scn1
但是,如果我像这样移动函数调用:
std::vector< std::string >::iterator it = g_SPP.scenarios->getVector().begin();
std::cout << "begin of vector: " << *it << std::endl;
it++;
std::cout << "second of vector: " << *it << std::endl;
Z_UB->set("s1", "scn2", 350);
结果如下,这是预期的行为:
begin of vector: scn1
second of vector: scn2
在 Z_UB->set() 函数中,除了调用本身之外什么都没有:
void Parameter::set( std::string _i, std::string _j, float value) {
//int i = indexSets[0]->backIndex(_i);
//int j = indexSets[1]->backIndex(_j);
//data2D[0][0] = value;
}
所以如果我在创建迭代器后调用 Z_UB->set() 函数,访问它会使程序崩溃。关于迭代器,我错过了什么重要的事情吗?
【问题讨论】:
-
这里没有足够的信息来诊断您的具体问题。迭代器不会“随机”失效,因此问题出在您的代码中,但从这篇文章 where 在您的代码中问题所在并不清楚。
Z_UB真的是Parameter类型吗?是否有任何其他类型可以修改底层vector?在调整vector的内部存储大小时,vector迭代器无效。 -
getVector() 是返回对向量的引用还是副本?
-
它返回一个向量的副本(就我没有在任何地方使用 & 而言)
-
事实证明,@Bo Persson 有正确的提示!在这一点上,返回向量对象的副本没有意义。它现在就像一个魅力。谢谢大家,我今天学到了很多东西!
-
我试图回答我自己的问题,但没有足够的声誉,我不能:)。任何人,请回答我的问题,我会将其标记为正确,否则我必须等待 6 小时才能回答我自己的问题。
标签: c++ function iterator call invalidation