C++通过扩展容器迭代

Lon*_*_GM 1 c++ iteration containers

如果我在迭代它时扩展容器会发生什么,我可能会遇到新元素或只是旧元素

std::vector<int> arr(0);
arr.push_back(1);
arr.push_back(2);
arr.push_back(3);

for (auto& ele : arr) {
    if (4 == ele) std::cout << "meet new eles" << endl;
    arr.push_back(4);
}
Run Code Online (Sandbox Code Playgroud)

nsu*_*ron 6

push_back 可以使向量的任何迭代器无效,你有什么未定义的行为.

std::vector在内部分配一个数组,其元素连续存储在内存中.为此,需要预先分配可能需要的大小估计,即所谓的向量容量.在push_back如果达到容量它分配一个新的更大的阵列,拷贝/移动前一阵到新的的所有内容,然后删除旧的.这会使迭代器失效,并继续指向已删除的数组.

另外值得一提的是,新阵列的分配增加了相当大的性能.如果您知道矢量将始终用于reserve()预分配内存的大小.

现在,确实如果你预先保留容量并且永远不会超过该容量,迭代器将不会失效(只有过去的迭代器),并且你可以继续递增它们,因为它们指向一个连续元素的数组.但我不建议这样做,IMO错误地重新分配矢量的风险是不值得的.