使用'for'循环迭代C++向量

286

我刚接触C++语言。我开始使用向量,并注意到在所有遍历向量的代码中,通过索引迭代时for循环的第一个参数总是基于这个向量的。在Java中,我可能会像这样使用ArrayList:

for(int i=0; i < vector.size(); i++){
   vector[i].doSomething();
}

我不明白为什么在C++中找不到这个东西?这是一种不好的实践吗?


1
for循环不是函数,因此它没有参数(或参数是您传递的内容)。你是指像这样std::vector<int>::size_type i = 0;吗?或者可能是std::vector<int>::iterator it = vector.begin(); - chris
5
在Java中,我更喜欢使用for-each循环或迭代器。与C++基本相同,尽管语法略有不同。 - Jesse Good
2
可能是为什么使用迭代器而不是数组索引?的重复问题。 - johnsyweb
17
这里大多数答案错误地假设问题为:“在迭代std::vector时,什么是最好/最短的方法?”实际上,这里所问的问题是:“我为什么看不到这种用法在C ++中?它是不好的编程习惯吗?”也就是说,“为什么我总是看到在迭代std::vector时使用迭代器的C++代码?” - Alok Save
1
我认为这个问题在这里有一个更好的解释:https://dev59.com/SHRC5IYBdhLWcg3wG9Nb - rabin
显示剩余4条评论
14个回答

5
我很惊讶没有人提到使用整数索引遍历数组会使您更容易编写错误代码,因为使用错误的索引对数组进行下标引用。例如,如果您使用 i 和< i> j 作为索引的嵌套循环,可能会错误地使用< i> j 而不是< i> i 对数组进行下标引用,从而在程序中引入故障。
相比之下,这里列出的其他形式,即基于范围的 for 循环和迭代器,则更少出现错误。语言的语义和编译器的类型检查机制将防止您意外访问使用错误索引的数组。

2
 //different declaration type
    vector<int>v;  
    vector<int>v2(5,30); //size is 5 and fill up with 30
    vector<int>v3={10,20,30};
    
    //From C++11 and onwards
    for(auto itr:v2)
        cout<<"\n"<<itr;
     
     //(pre c++11)   
    for(auto itr=v3.begin(); itr !=v3.end(); itr++)
        cout<<"\n"<<*itr;

1
int main()
{
    int n;
    int input;
    vector<int> p1;
    vector<int> ::iterator it;

    cout << "Enter the number of elements you want to insert" << endl;
    cin >> n;

    for (int i = 0;i < n;i++)
    {
        cin >> input;
        p1.push_back(input);
    }
    for(it=p1.begin();it!=p1.end();it++)
    {
        cout << *it << endl;
    }
      //Iterating in vector through iterator it

    return 0;
}

传统迭代器形式


-4

如果你使用

std::vector<std::reference_wrapper<std::string>> names{ };

不要忘记,在for循环中使用auto时,也要使用get,像这样:
for (auto element in : names)
{
    element.get()//do something
}

那不是有效的语法。 - John Doe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接