迭代器vs.s.基于Qt的循环的索引

时间:2011-02-02 13:44:51

标签: qt iterator indexing

  

因此,迭代器很少   与QList有关。一   STL样式迭代器的位置   有意义的是作为泛型

的参数

http://doc.qt.digia.com/4.2/qlist-iterator.html

因此,如果我有一个for循环,那么宏foreach不是一个选项。我应该使用迭代器还是索引?

  for(int i = 0; i < list.size(); i++) {

       Do something with list[i]

       blah blah blah

  }



  for(QList<type>::iterator i = list.begin(); i != list.end(); ++i) {

          Do something with *i

          blah blah blah

  }

4 个答案:

答案 0 :(得分:3)

Qt拥有自己的foreach宏。我也想不出为什么foreach不是一个选择的原因......

最重要的区别在于您是否需要修改循环中的列表内容,因为使用索引API可能会更难以阅读。

如果您只想为我有这些偏好的每件物品做点什么:

  1. 将foreach与(const-)引用类型一起使用,让框架做正确的事
  2. 使用index api :: at(int)(引自4.7文档:“QList的实现方式使得基于索引的直接访问与使用迭代器一样快”&amp;“at()可能比运算符[]“
  3. 使用iterator API
  4. 但这只是一个风格问题。如果这对性能至关重要,那么您需要担心细微的差异,您应该考虑重新设计或编写自己的专业列表。

答案 1 :(得分:2)

我认为这取决于“等等等等”真正做到了什么,但通常我会选择后一种形式与std::foreach功能相结合,但我认为这只是品味问题。

顺便说一下,当你写宏foreach时,你的意思是std::foreach吗?如果是这样,请注意它不是一个宏。

答案 2 :(得分:2)

我还会考虑两个版本之间的性能损失。不断计算list [i]比计算++ i一次要昂贵得多。如果你真的想使用索引表示法并且不会遭受太多性能损失,我建议在那里抛出一个引用来保存它。

for(int i = 0; i < list.size(); ++i) {

   ListItem &list_item = list[i];

   // do something with list_item
}

[我也使用++ i而不是i ++,因为它通常被认为更快。]

答案 3 :(得分:1)

在这个具体的例子中,没有太大的区别。

除此之外,学习使用stl类型的迭代器总是一个好主意,但是当你开始学习stl算法时,它们特别方便,就像foreach一样。但请不要就此止步 - 当然要选择transformsortremove_copy_if等等。

毕竟,他们是标准库的一部分!