首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量C++11的范围基和插入

向量C++11的范围基和插入
EN

Stack Overflow用户
提问于 2014-04-09 16:35:39
回答 3查看 1.4K关注 0票数 5

在C++11中迭代时可以改变向量的大小吗?显然,迭代器将失效,但是仍然可以使用以下干净的语法吗?

代码语言:javascript
复制
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)
}

如果没有,完成此任务的最干净的代码是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-09 16:41:33

不,你不能。标准要求raged-based for的行为像一个给定的算法。该算法使用迭代器,当修改向量时,迭代器将失效。

对我来说,最简单的方法就是使用迭代器。注意,当我们插入时,我们也重新分配迭代器,以便我们总是有一个有效的迭代器:

代码语言:javascript
复制
auto it = vec.begin();
while(it < vec.end()) {
  if (condition(*it)) {
    new_elem = function(*it);
    it = vec.insert(it + 1, new_elem);
  }
  ++it;
}
票数 7
EN

Stack Overflow用户

发布于 2014-04-09 16:43:31

不,您不能使用这个技巧,因为在range循环后面有一个迭代器。一旦该迭代器失效,您就不能再次引用它。

如果在插入后立即退出循环,则可以使用此构造。否则,您需要使用从后面开始的基于索引的循环,然后下降到零,以避免“看到”在执行循环期间插入的元素。

代码语言:javascript
复制
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)
}
票数 2
EN

Stack Overflow用户

发布于 2014-04-09 16:42:18

代码语言:javascript
复制
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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22968721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档