use*_*189 18 c++ iteration stl
在迭代数据结构时将元素添加到数据结构(例如向量)时会发生什么.我可以不这样做吗?
我尝试了这个,它打破了:
int main() {
vector<int> x = { 1, 2, 3 };
int j = 0;
for (auto it = x.begin(); it != x.end(); ++it) {
x.push_back(j);
j++;
cout << j << " .. ";
}
}
Run Code Online (Sandbox Code Playgroud)
Lig*_*ica 15
某些修改a的操作会使迭代器失效std::vector.
其他容器有关于迭代器何时无效的各种规则.这是一篇文章(由您自己真实地)提供详细信息.
顺便说一句,入口点函数main() 必须返回int:
int main() { ... }
Run Code Online (Sandbox Code Playgroud)
Naw*_*waz 11
在迭代数据结构时将元素添加到数据结构(例如向量)时会发生什么.我不能这个吗?
如果向量调整自身,迭代器将变为无效.所以只要矢量没有自己调整大小,你就是安全的.
我建议你避免这个.
重新调整大小使迭代器失效的简短解释:
最初向量具有一定的容量(你可以通过调用来知道vector::capacity()),然后向它添加元素,当它变满时,它会分配更大的内存,将元素从旧内存复制到新分配的内存,以及然后删除旧的内存,问题是迭代器仍然指向已经解除分配的旧内存.这就是调整大小使迭代器失效的方法.
这是简单的演示.只看到capacity变化时:
std::vector<int> v;
for(int i = 0 ; i < 100 ; i++ )
{
std::cout <<"size = "<<v.size()<<", capacity = "<<v.capacity()<<std::endl;
v.push_back(i);
}
Run Code Online (Sandbox Code Playgroud)
部分输出:
size = 0, capacity = 0
size = 1, capacity = 1
size = 2, capacity = 2
size = 3, capacity = 4
size = 4, capacity = 4
size = 5, capacity = 8
size = 6, capacity = 8
size = 7, capacity = 8
size = 8, capacity = 8
size = 9, capacity = 16
size = 10, capacity = 16
Run Code Online (Sandbox Code Playgroud)
请在此处查看完整输出:http://ideone.com/rQfWe
注意: capacity()告诉向量在不分配新内存的情况下可以包含的最大元素数,并size()告诉向量当前包含的元素数.