c++ - 如何在 C++ 中定义自定义迭代器

标签 c++ iterator

我在 SO 上看过很多关于如何定义自定义迭代器的帖子,但似乎没有什么能完全回答我的问题,即......

如何创建隐藏嵌套 for 循环的迭代器?

例如,我有一个类Foo,Foo里面是一个Bar,Bar里面是一个字符串。我可以写

for (const Foo& foo : foo_set)
  for (const Bar& bar : foo.bar_set)
    if (bar.my_string != "baz")
      cout << bar.my_string << endl;

但我希望能够做类似的事情:

for (const string& good : foo_set)
  cout << good << endl;

我该如何做这样的事情?

最佳答案

已经有proposals以及关于segmented iterators的讨论,但没有一个真正将其纳入 C++ 标准(无论如何)。

就目前而言,处理它的最干净的方法(无论如何,在我看来)是作为一个项目的集合,每个项目本身就是一个集合:

std::ostream &operator<<(std::ostream &os, bar const &b) { 
     return os << b.my_string;
}

std::ostream &operator<<(std::ostream &os, foo const &f) { 
     std::remove_copy_if(f.begin(), f.end(), 
                         std::ostream_iterator<bar>(os, "\n"),
                         [](bar const &b) { return b.my_string != "baz"; });

     return os;
}

std::copy(foo_set.begin(), foo_set.end(), 
          std::ostream_iterator<foo>(std::cout, "\n"));

或者,如果你坚持的话:

for (auto s : foo_set)
    std::cout << s << "\n";

关于c++ - 如何在 C++ 中定义自定义迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13482468/

相关文章:

java - 基于其中元素数量的 java.util.List 的异常行为

c++ - 在 C++20 中,如何编写连续迭代器?

c++ - 如何在 C++ 中将两个数据集保存在两个单独的 vector 中

c++ - 无法推导成员函数包装器的返回类型

c++ - 这个opencv代码有什么问题

包含 ddd 调试器选项的 C++ Makefile

c++ - forward_list 迭代器稳定吗?

c++ - 是否有其他容器类型的 string_view 等效项?

c++ - 如何一一删除STL deque的所有元素?

c++ - 表达式必须有指针类型错误 visual studio 2012