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 的任何调用都会使整个批次无效,并且下一个无效的向量取消引用会导致未定义的行为。

您有两个基本选择:

  1. 当附加值被添加到迭代器时,将 vector 替换为不会使其现有迭代器失效的其他容器

  2. 使用向量索引而不是迭代器重新实现整个逻辑。