为什么vector不会在循环中更新?

时间:2014-10-28 15:27:07

标签: c++ c++11 vector

我想更新矢量'v',以便我可以从0-100开始迭代。

我知道这是不允许的,但如果我只想这样做怎么办? 有什么办法吗?

int main() {
    // your code goes here
    vector<int> v;
    v.push_back(1);
    int count = 0;

    for(int elem: v){
        if(count<100)
        v.push_back(count);
        count++;
    }

    for(int elem: v)
    cout << elem << endl;

    return 0;
}

输出结果为:

1    
0

5 个答案:

答案 0 :(得分:11)

从基于范围的for循环的definition可以看出, end_expr 不会在迭代之间更新。因此,您只有一次迭代。 push_back使v.end()无效(这是 end_expr 与链接页面中描述的内容相同),因此您拥有的实际上是未定义的行为。

用0..100填充矢量的最简单的方法是:

vector<int> v(101);
std::iota(v.begin(), v.end(), 0);

答案 1 :(得分:3)

您应该使用此代码

int count = 0;
while (v.size() < 100) {
   v.push_back(count++)
}

不允许在迭代过程中修改向量

答案 2 :(得分:2)

使用您的代码:

for(int elem: v){
    if(count<100)
        v.push_back(count);
    count++;
}

就像使用它:

int i = v.size();
for(int j = 0; j < i; j++){
     v.push_back(j);
}

我真的不知道为什么...... v.size()可能会留在内存中进行优化和数据保护

OP评论后编辑:

试试这个

int i = v.size();
for(int j = 0; j < i; j++){
    if(j<100)
        i = v.size();
    v.push_back(count);
}

答案 3 :(得分:2)

此操作的最佳方法

vector<int> v;
v.resize(100);
for(unsigned int i = 0; i < v.size(); i++)
{
    v[i] = i;
}

与上述相同。

答案 4 :(得分:2)

range-based for loop生成与此类似的代码:

{
auto && __range = range_expression ; 
    for (auto __begin = begin_expr,__end = end_expr; __begin != __end; ++__begin) { 
        range_declaration = *__begin; 
        loop_statement 
  } 
} 

正如您所看到的,当您在容器上进行迭代时,范围不会更新。

此外,您很可能最终会遇到未定义的行为,因为当vectorvector时,如果调整大小,这些迭代器将无效。

有关填充{{1}}的更好方法,请参阅@ user2079303。