在C++11中迭代时可以改变向量的大小吗?显然,迭代器将失效,但是仍然可以使用以下干净的语法吗?
std::vector<some_type> vec;
for(auto elem : vec) {
if(condition(elem)) {
new_elem = function(elem);
vec.insert(iterator_associated_with_elem+1, new_elem);
}
//Don't insert on condition(new_elem)
}如果没有,完成此任务的最干净的代码是什么?
发布于 2014-04-09 16:41:33
不,你不能。标准要求raged-based for的行为像一个给定的算法。该算法使用迭代器,当修改向量时,迭代器将失效。
对我来说,最简单的方法就是使用迭代器。注意,当我们插入时,我们也重新分配迭代器,以便我们总是有一个有效的迭代器:
auto it = vec.begin();
while(it < vec.end()) {
if (condition(*it)) {
new_elem = function(*it);
it = vec.insert(it + 1, new_elem);
}
++it;
}发布于 2014-04-09 16:43:31
不,您不能使用这个技巧,因为在range循环后面有一个迭代器。一旦该迭代器失效,您就不能再次引用它。
如果在插入后立即退出循环,则可以使用此构造。否则,您需要使用从后面开始的基于索引的循环,然后下降到零,以避免“看到”在执行循环期间插入的元素。
std::vector<some_type> vec;
for(int i = vec.size()-1 ; i >= 0 ; i--) {
const some_type& elem(vec[i]);
if(condition(elem)) {
vec.insert(vec.begin()+i+1, function(elem));
}
//Don't insert on condition(new_elem)
}发布于 2014-04-09 16:42:18
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto &val : vec)
{
static int i = 0;
if (val == 5)
{
vec.insert(vec.begin() + i + 1, 6);
}
++i;
}然后,vec的值为:1 2 3 4 5 6。
https://stackoverflow.com/questions/22968721
复制相似问题