gpt4 book ai didi

c++ - 为什么在使用迭代器时添加到 vector 不起作用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:59 27 4
gpt4 key购买 nike

我有两个代码示例,它们做的事情完全相同。一个在 C++03 和 C++11 中。

C++ 11

int main()
{
vector<int> v = {1,2,3};

int count = 0;

for each (auto it in v)
{
cout << it<<endl;

if (count == 0)
{
count++;
v.push_back(4);//adding value to vector
}
}

return 0;
}

C++ 03

int main()
{
vector<int> v = {1,2,3};

int count = 0;

for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{

cout << *it<<endl;

if (count == 0)
{
count++;
v.push_back(4);//adding value to vector
}
}

return 0;
}

这两个代码都给出了以下异常。

enter image description here

现在当我看到 vector::end() 实现时,

iterator end() _NOEXCEPT
{
// return iterator for end of mutable sequence
return (iterator(this->_Mylast, this));
}

这里,inline function 明明是用_Mylast来计算结束的。因此,当我添加时,它的指针将递增到下一个位置,例如 _Mylast++。为什么我会收到此异常?

谢谢。

最佳答案

vector 将其元素存储在连续的内存中。如果该内存块需要重新分配,迭代器将失效。

如果您需要在迭代时修改 vector 的大小,请按索引而不是 iterator 进行迭代。

另一种选择是使用具有不同迭代器行为的不同容器,例如 list 将允许您在插入项目时继续迭代。

最后,(我敢这么建议吗?)如果您知道 vector 将增长到的最大大小,请在对其进行迭代之前.reserve() 它。这将确保它不会在您的循环期间被重新分配。我不确定标准是否保证了这种行为(也许有人可以插话);考虑到按索引迭代是绝对安全的,我绝对不会这样做。

关于c++ - 为什么在使用迭代器时添加到 vector 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22507064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com