使用“for”循环遍历 C 向量

新手上路,请多包涵

我是 C++ 语言的新手。我已经开始使用向量,并且注意到在我看到通过索引迭代向量的所有代码中, for 循环的第一个参数始终基于向量。在 Java 中,我可能会用 ArrayList 做这样的事情:

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

我在 C++ 中看不到这个是有原因的吗?这是不好的做法吗?

原文由 Flynn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 624
2 个回答

有什么理由我在 C++ 中看不到这个吗?这是不好的做法吗?

不,这不是一个坏习惯,但以下方法使您的代码具有一定的 灵活性

通常,在 C++11 之前,用于迭代容器元素的代码使用迭代器,例如:

 std::vector<int>::iterator it = vector.begin();

这是因为它使代码更加灵活。

所有标准库容器都支持并提供迭代器。如果在以后的开发阶段您需要切换到另一个容器,则无需更改此代码。

注意: 编写适用于所有可能的标准库容器的代码并不像看起来那么容易。

原文由 Alok Save 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题