C++ 在添加项目时跟踪开始迭代器
C++ Keeping track of start iterator while adding items
我正在尝试对 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
指向数组外部的位置并提供垃圾数据。造成这种情况的原因是什么?避免这种情况的最佳方法是什么?我知道修改你迭代的东西是在招惹麻烦...
nums.push_back(sum);
如果 push_back
最终重新分配向量,push_back
会使向量的所有现有迭代器无效。
向量就是这样工作的。最初,一些额外的 space 被保留用于向量的增长。 Vector 保存其内容的内部缓冲区有一些额外的空闲空间,但当它已满时,下一次调用 push_back
会为 vector 的内容分配一个更大的缓冲区,移动现有缓冲区的内容,然后删除现有缓冲区.
显示的代码为向量创建和使用迭代器,但是对 push_back
的任何调用都会使整个批次无效,并且下一个无效的向量取消引用会导致未定义的行为。
您有两个基本选择:
当附加值被添加到迭代器时,将 vector 替换为不会使其现有迭代器失效的其他容器
使用向量索引而不是迭代器重新实现整个逻辑。
我正在尝试对 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
指向数组外部的位置并提供垃圾数据。造成这种情况的原因是什么?避免这种情况的最佳方法是什么?我知道修改你迭代的东西是在招惹麻烦...
nums.push_back(sum);
如果 push_back
最终重新分配向量,push_back
会使向量的所有现有迭代器无效。
向量就是这样工作的。最初,一些额外的 space 被保留用于向量的增长。 Vector 保存其内容的内部缓冲区有一些额外的空闲空间,但当它已满时,下一次调用 push_back
会为 vector 的内容分配一个更大的缓冲区,移动现有缓冲区的内容,然后删除现有缓冲区.
显示的代码为向量创建和使用迭代器,但是对 push_back
的任何调用都会使整个批次无效,并且下一个无效的向量取消引用会导致未定义的行为。
您有两个基本选择:
当附加值被添加到迭代器时,将 vector 替换为不会使其现有迭代器失效的其他容器
使用向量索引而不是迭代器重新实现整个逻辑。