我不熟悉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++中看不到这个的原因是什么呢?这是不好的做法吗?
当前回答
在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成为对元素的引用,而不是它们的副本。它与上面的基于迭代器的方法非常相似,但更易于读写。)
其他回答
如果你使用
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;
}
迭代器的常规形式
正确的做法是:
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根本没有操作符[]。
为什么你没有看到这样的实践是非常主观的,不能有一个明确的答案,因为我已经看到许多代码使用你提到的方式,而不是迭代器风格的代码。
以下可能是人们不考虑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;