我是 C++ 语言的新手。我已经开始使用向量,并且注意到在我看到通过索引迭代向量的所有代码中, for
循环的第一个参数始终基于向量。在 Java 中,我可能会用 ArrayList 做这样的事情:
for(int i=0; i < vector.size(); i++){
vector[i].doSomething();
}
我在 C++ 中看不到这个是有原因的吗?这是不好的做法吗?
原文由 Flynn 发布,翻译遵循 CC BY-SA 4.0 许可协议
我是 C++ 语言的新手。我已经开始使用向量,并且注意到在我看到通过索引迭代向量的所有代码中, for
循环的第一个参数始终基于向量。在 Java 中,我可能会用 ArrayList 做这样的事情:
for(int i=0; i < vector.size(); i++){
vector[i].doSomething();
}
我在 C++ 中看不到这个是有原因的吗?这是不好的做法吗?
原文由 Flynn 发布,翻译遵循 CC BY-SA 4.0 许可协议
不要忘记具有 const 正确性的示例 - 循环可以修改元素吗?这里的许多示例都没有,并且应该使用 cont 迭代器。这里我们假设
class T {
public:
T (double d) : _d { d } {}
void doSomething () const { cout << _d << endl; return; }
void changeSomething () { ++_d; return; }
private:
double _d;
};
vector<T> v;
// ...
for (const auto iter = v.cbegin(); iter != v.cend(); ++iter) {
iter->doSomething();
}
另请注意,使用 C++11 表示法,默认是复制元素。使用引用来避免这种情况,和/或允许修改原始元素:
vector<T> v;
// ...
for (auto t : v) {
t.changeSomething(); // changes local t, but not element of v
t.doSomething();
}
for (auto& t : v) { // reference avoids copying element
t.changeSomething(); // changes element of v
t.doSomething();
}
for (const auto& t : v) { // reference avoids copying element
t.doSomething(); // element can not be changed
}
原文由 John O‘Donnell 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答2.9k 阅读✓ 已解决
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
不,这不是一个坏习惯,但以下方法使您的代码具有一定的 灵活性。
通常,在 C++11 之前,用于迭代容器元素的代码使用迭代器,例如:
这是因为它使代码更加灵活。
所有标准库容器都支持并提供迭代器。如果在以后的开发阶段您需要切换到另一个容器,则无需更改此代码。
注意: 编写适用于所有可能的标准库容器的代码并不像看起来那么容易。