我不熟悉c++语言。我已经开始使用向量,并注意到在我看到的所有通过索引遍历向量的代码中,for循环的第一个参数总是基于向量的值。在Java中,我可以对数组列表做这样的事情:

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

我在c++中看不到这个的原因是什么呢?这是不好的做法吗?


当前回答

如果你使用

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

不要忘记,当你在for循环中使用auto时,也要使用get,就像这样:

for (auto element in : names)
{
    element.get()//do something
}

其他回答

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;
}

迭代器的常规形式

令我惊讶的是,没有人提到遍历具有整数索引的数组会很容易通过下标具有错误索引的数组来编写错误代码。例如,如果使用i和j作为下标嵌套循环,则可能错误地将数组下标为j而不是i,从而在程序中引入错误。

相比之下,这里列出的其他形式,即基于范围的for循环和迭代器,更不容易出错。该语言的语义和编译器的类型检查机制将防止您意外地使用错误的索引访问数组。

正确的做法是:

for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
    it->doSomething();
 }

其中T是向量中类的类型。例如,如果类是CActivity,只需写CActivity而不是T。

这种类型的方法将适用于每个STL(不仅仅是向量,这是更好的一点)。

如果你仍然想使用索引,方法是:

for(std::vector<T>::size_type i = 0; i != v.size(); i++) {
    v[i].doSomething();
}

在STL中,程序员使用迭代器遍历容器,因为迭代器是一个抽象概念,在所有标准容器中实现。例如,std::list根本没有操作符[]。

这是一个更简单的方法来迭代和打印值在向量。

for(int x: A) // for integer x in vector A
    cout<< x <<" ";