簡體   English   中英

是否有c.ended(iter)方法與基於范圍的for循環兼容?

[英]Is there a c.ended(iter) method compatible with range-based for-loops?

如果我理解正確,則基於范圍的for循環通過在迭代器(iter)和集合(c)上調用iter!= c.end()來檢查結束條件。 但是,假設我有一個集合,其中生成c.end()的迭代器不是特別容易或有效?

基於范圍的for循環是否可以識別另一種方法(例如bool c.ended(iter) const ),該方法將iter用作參數並檢查其是否到達末尾? 模板有一些技巧可以達到相同的效果嗎?

例:

想象一下,我們有一個forward_list,其中有一個標頭/結尾節點來標記結尾,但是它沒有指向該節點的指針。 相反,它具有某種方法,可以在到達節點時識別該節點。 然后,我們不能輕易創建一個指向該節點的迭代器,但是如果一個迭代器確實已經指向該節點,我們就能知道。

范例2:

好的,顯然示例1是不好的。 我會更接近我的實際工作(盡管還有更多)。 forward_list可能沒有任何擦除方法,因此很令人沮喪。 只有一個“ ases_after()”。 因此,要糾正這一點,我希望有一個替代的forward_list,其中迭代器在內部包含一個指向該節點的指針,該指針聲稱它指向該節點。 現在,我可以擁有一個行為正確的delete()方法(以不必擔心其他事情是否會擦除我內部位於的節點為代價)。 現在,生成end()的迭代器需要弄清楚列表中的最后一個元素是什么。 我可以維護一個指針,但這實際上只是浪費了內存,因為檢查iterator == end()是否應該很容易。 我可以只檢查p_my_node-> next == NULL。

基於范圍的for循環的實現只能在容器上調用一次end()函數,因此,如果您對此感到擔憂,則該問題已在標准中得到解決。

如果除了c.end()之外還有其他可以用作范圍結束檢查的東西,並且比c.end()便宜,那么為什么c.end()不僅如此?


在注釋中僅通過英語可能很難理解這個想法,但是這種實現的草圖應該能夠為您提供一個想法:

class Iterator {
   node *ptr;    // nullptr == end() by convention
public:
   Iterator() : ptr() {}
   Iterator(node *ptr) : ptr(ptr) {}
   bool isEnd() const {
      return !ptr || ptr->isEnd();
   }
   friend bool operator==(Iterator const& lhs, Iterator const& rhs) {
      return (lhs.isEnd() && rhs.isEnd())
          || (lhs.ptr == rhs.ptr);
   } 
};

現在, end()的實現是一個便宜的實現:

Iterator Container::end() {
   return Iterator();
}

可能的解決方案是為c.end()創建一種特殊的迭代器,然后使your_iterator::operator==()調用c.ended(iter)並在將結束迭代器作為參數時返回該值。 我認為您可以為不同的迭代器類型(結束迭代器)創建特殊的重載operator== ,但是如果這樣一個好的解決方案很難事先說明。 但是,您可以在最終迭代器中使用特殊標志或特殊值,並在運行時在operator==()具有該行為。

暫無
暫無

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

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