我不熟悉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++中看不到这个的原因是什么呢?这是不好的做法吗?
当前回答
有什么原因让我在c++中看不到这个吗?这是不好的做法吗?
不。这不是一个不好的实践,但是下面的方法使您的代码具有一定的灵活性。
通常,在c++ 11之前,迭代容器元素的代码使用迭代器,类似于:
std::vector<int>::iterator it = vector.begin();
这是因为它使代码更加灵活。
所有标准库容器都支持并提供迭代器。如果在开发的后期需要切换到另一个容器,则不需要更改此代码。
注意:编写适用于所有可能的标准库容器的代码并不像看起来那么容易。
其他回答
使用迭代器有几个强有力的理由,这里提到了其中一些:
稍后切换容器不会使代码失效。
例如,如果从std::vector转换为std::list或std::set,则不能使用数值索引来获取包含的值。使用迭代器仍然有效。
无效迭代的运行时捕获
如果在循环中间修改容器,下次使用迭代器时,它将抛出一个无效的迭代器异常。
在STL中,程序员使用迭代器遍历容器,因为迭代器是一个抽象概念,在所有标准容器中实现。例如,std::list根本没有操作符[]。
有什么原因让我在c++中看不到这个吗?这是不好的做法吗?
不。这不是一个不好的实践,但是下面的方法使您的代码具有一定的灵活性。
通常,在c++ 11之前,迭代容器元素的代码使用迭代器,类似于:
std::vector<int>::iterator it = vector.begin();
这是因为它使代码更加灵活。
所有标准库容器都支持并提供迭代器。如果在开发的后期需要切换到另一个容器,则不需要更改此代码。
注意:编写适用于所有可能的标准库容器的代码并不像看起来那么容易。
使用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类型的向量,同样的语法也可以工作得很好
正确的做法是:
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();
}