【发布时间】:2022-01-03 08:50:26
【问题描述】:
我正在尝试在 std::vector 上进行双循环,以探索向量中项目的所有组合。如果结果很好,我将它添加到向量中以进行另一遍。这被用于关联规则问题,但我为这个问题做了一个较小的演示。似乎当我push_back 时,它有时会更改向量,使得原始迭代器不再起作用。例如:
std::vector<int> nums{1,2,3,4,5};
auto nextStart = nums.begin();
while (nextStart != nums.end()){
auto currentStart = nextStart;
auto currentEnd = nums.end();
nextStart = currentEnd;
for (auto a = currentStart; a!= currentEnd-1; a++){
for (auto b = currentStart+1; b != currentEnd; b++){
auto sum = (*a) + (*b);
if (sum < 10) nums.push_back(sum);
}
}
}
在某些迭代中,currentStart 指向数组外部的位置并提供垃圾数据。是什么导致了这种情况,避免这种情况的最佳方法是什么?我知道修改你迭代的东西是自找麻烦......
【问题讨论】:
-
push_back使向量上的所有迭代器无效,因为底层内存的重新分配可以移动它。在这种情况下,更安全的方法是使用索引。 -
改用
std::list。 -
只使用索引。它不那么惯用,但对于像这样使迭代器无效的循环来说,这是正确的方法。