我不熟悉c++语言。我已经开始使用向量,并注意到在我看到的所有通过索引遍历向量的代码中,for循环的第一个参数总是基于向量的值。在Java中,我可以对数组列表做这样的事情:
for(int i=0; i < vector.size(); i++){
vector[i].doSomething();
}
我在c++中看不到这个的原因是什么呢?这是不好的做法吗?
我不熟悉c++语言。我已经开始使用向量,并注意到在我看到的所有通过索引遍历向量的代码中,for循环的第一个参数总是基于向量的值。在Java中,我可以对数组列表做这样的事情:
for(int i=0; i < vector.size(); i++){
vector[i].doSomething();
}
我在c++中看不到这个的原因是什么呢?这是不好的做法吗?
当前回答
//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;
其他回答
为什么你没有看到这样的实践是非常主观的,不能有一个明确的答案,因为我已经看到许多代码使用你提到的方式,而不是迭代器风格的代码。
以下可能是人们不考虑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;
有什么原因让我在c++中看不到这个吗?这是不好的做法吗?
不。这不是一个不好的实践,但是下面的方法使您的代码具有一定的灵活性。
通常,在c++ 11之前,迭代容器元素的代码使用迭代器,类似于:
std::vector<int>::iterator it = vector.begin();
这是因为它使代码更加灵活。
所有标准库容器都支持并提供迭代器。如果在开发的后期需要切换到另一个容器,则不需要更改此代码。
注意:编写适用于所有可能的标准库容器的代码并不像看起来那么容易。
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;
}
迭代器的常规形式
使用迭代器有几个强有力的理由,这里提到了其中一些:
稍后切换容器不会使代码失效。
例如,如果从std::vector转换为std::list或std::set,则不能使用数值索引来获取包含的值。使用迭代器仍然有效。
无效迭代的运行时捕获
如果在循环中间修改容器,下次使用迭代器时,它将抛出一个无效的迭代器异常。
这是一个更简单的方法来迭代和打印值在向量。
for(int x: A) // for integer x in vector A
cout<< x <<" ";