假设我们有以下内容:

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) {
  ...
}


看来,boost迭代器适配器在这里可能会派上用场。但是我不知道哪种适配器适合此目的。

最佳答案

使用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()) {
    // ...
}

09-07 04:17