【发布时间】:2013-05-13 00:50:22
【问题描述】:
C++11 基于范围的 for 循环取消引用迭代器。这是否意味着将它与boost::adaptors::indexed 一起使用没有意义?示例:
boost::counting_range numbers(10,20);
for(auto i : numbers | indexed(0)) {
cout << "number = " i
/* << " | index = " << i.index() */ // i is an integer!
<< "\n";
}
我总是可以使用计数器,但我喜欢索引迭代器。
- 是否可以通过基于范围的 for 循环以某种方式使用它们?
- 将基于范围的循环与索引一起使用的习惯用法是什么? (只是一个普通的计数器?)
【问题讨论】:
-
indexed很糟糕,因为它将index()方法添加到 iterator,而不是从取消引用迭代器返回的值。 :// -
@Xeo 确实如此。我不时需要范围内元素的索引。首先我觉得很糟糕。然后,我介绍一个计数器。如果容器可以通过普通的旧循环轻松访问,我再次感到难过并将基于范围的循环重写为普通的旧循环。
-
正如 Xeo 提到的 boost indexed 对此并不好。如果你不介意切换库,这里有一些基于 python 的 itertools 的 C++ 范围库,例如:github.com/ryanhaining/cppitertools
-
注意:自 Boost 1.56(2014 年 8 月发布)以来,此问题已修复;该元素在
value_type后面间接使用index()和value()成员函数。 -
@gnzlbg,你能把
boost::adaptor::indexed改成boost::adaptors::indexed吗,因为我花了一段时间才意识到s不见了?
标签: c++11 boost-range