我想更新矢量'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
答案 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
}
}
正如您所看到的,当您在容器上进行迭代时,范围不会更新。
此外,您很可能最终会遇到未定义的行为,因为当vector
为vector
时,如果调整大小,这些迭代器将无效。
有关填充{{1}}的更好方法,请参阅@ user2079303。