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

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

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


当前回答

使用auto操作符真的很容易使用,因为人们不必担心数据类型和向量或任何其他数据结构的大小

使用auto和for循环迭代vector

vector<int> vec = {1,2,3,4,5}

for(auto itr : vec)
    cout << itr << " ";

输出:

1 2 3 4 5

您还可以使用此方法迭代集和列表。使用auto会自动检测模板中使用的数据类型,并允许您使用它。 所以,即使我们有一个string或char类型的向量,同样的语法也可以工作得很好

其他回答

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

迭代器的常规形式

为什么你没有看到这样的实践是非常主观的,不能有一个明确的答案,因为我已经看到许多代码使用你提到的方式,而不是迭代器风格的代码。

以下可能是人们不考虑vector.size()循环方式的原因:

每次在循环中都要调用size() 条件。然而,这要么不是问题,要么是小事 固定 优先选择std::for_each()而不是for循环本身 稍后将容器从std::vector更改为其他容器(例如:std::vector)。 Map, list)也会要求改变循环机制, 因为不是每个容器都支持size()类型的循环

c++ 11提供了在容器间移动的良好工具。这被称为“基于范围的for循环”(或Java中的“增强for循环”)。

用很少的代码,你可以遍历完整的(强制的!)std::vector:

vector<int> vi;
...
for(int i : vi) 
  cout << "i = " << i << endl;

在vector上迭代并打印其值的正确方法如下:

#include<vector>

// declare the vector of type int
vector<int> v;

// insert elements in the vector
for (unsigned int i = 0; i < 5; ++i){
    v.push_back(i);
}

// print those elements
for (auto it = v.begin(); it != v.end(); ++it){
    std::cout << *it << std::endl;
}

但至少在目前的情况下,使用基于范围的for循环会更好: 对于(auto x: v) std::cout << x << "\n"; (你也可以在auto后面加上&,使x成为对元素的引用,而不是它们的副本。它与上面的基于迭代器的方法非常相似,但更易于读写。)

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

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

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