假设我们有以下内容:
struct MyClass {
typedef vector<MyValue> InnerVector;
const InnerVector & get() { ... }
};
vector<MyClass> classes;
有没有办法在classes
上提供一个"扁平化"迭代器?那就是查看classes
,就好像它是一些InnerVector
列表一样。迭代器的每次取消引用都应返回一个InnerVector
。如下所示:
auto all_inner_vectors = magic_iterator(classes);
for (auto inner_vector : all_inner_vectors) {
...
}
似乎提升迭代器适配器在这里可能很方便。但是我无法弄清楚什么适配器适合这个目的。
使用 range-v3,您可以这样做
for (MyValue& value : myClass.get() | ranges::view::join) {
// ...
}
或者,您可以将类更改为直接使用 join:
struct MyClass {
using InnerVector = vector<MyValue>;
// Return a range of MyValue.
auto get() { return InnerVector | ranges::view::join; }
};
然后
for (MyValue& value : myClass.get()) {
// ...
}