簡體   English   中英

如何在 C++ 中定義自定義迭代器

[英]How to define a custom iterator in C++

我已經在 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;

我怎么做這樣的事情?

已經有關於分段迭代器的提議和討論,但沒有一個真正進入 C++ 標准(無論如何)。

就目前而言,處理它的最簡潔方法(無論如何,IMO)是作為項目的集合,每個項目本身都是一個集合:

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";

是的。

什么,你想要更多的細節?

這應該有很多幫助: http : //www.boost.org/doc/libs/1_52_0/libs/iterator/doc/index.html#iterator-facade-and-adaptor

或者: http : //www.boost.org/doc/libs/1_52_0/libs/iterator/doc/iterator_facade.html#usage (函數輸入迭代器也可能運行良好)。

你在范圍內工作。 迭代器的內部狀態是一個由內部迭代器、外部迭代器和一個表示是否在最后的標志組成的元組。 Increment 推進內部迭代器,檢查它是否等於內部范圍的 end,如果是,則推進外部迭代器直到它到達外部范圍的末尾或非空的內部范圍(然后將內部迭代器設置為外迭代器,如果外迭代器沒有結束!)

取消引用只是取消引用內部迭代器。 盲目的! (好吧,拋出一些斷言)

Equality 檢查外部迭代器是否相等,如果是,則檢查是否設置了“結束標志”。 如果不是,則比較內部迭代器是否相等。 (有沒有一種優雅的方法來避免那個結束標志?)

獲取第一個元素包括找到第一個非空內部范圍的迭代器。

遞減有點棘手,但不是您的任務所必需的。

必須注意避免在外部迭代器有效時出現無效的內部迭代器。 我想我列出了上面的大部分問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM