簡體   English   中英

如何將指針作為迭代器返回?

[英]How to return a pointer as an iterator?

我需要實現迭代器,我沒有時間制作好的迭代器類,所以我決定只返回指針。 就是這樣的

int* begin()
{
    return p;
}

但我希望它們像通常的stl迭代器一樣運行

*++begin(); // doesn't work because returned pointer isn't l-value

std::vector<int> vi{ 0, 1 };
*++vi.begin(); // works fine

int* p = begin();
*++p;  // works fine as well

我怎樣才能做到這一點?

指針完全滿足迭代器要求(指針甚至滿足最專業的隨機訪問迭代器要求)。 您的問題來自這樣一個事實,即在您使用的標准庫的實現中,例如std::vector提供的迭代器支持的操作多於迭代器要求所需的操作。

換言之,該標准並不能保證++vi.begin()將用於工作std::vector迭代器vi 它恰好適用於標准庫的實現,但它是一個實現細節。 一個支持它的迭代器仍然是一個完全有效的迭代器。

所以,回答你的問題:如果你想要一個支持所有迭代器操作的迭代器的快速替換,你當然可以使用指針。 如果您想要一個迭代器的快速替換,除了迭代器要求之外,它還將支持標准庫實現支持的所有操作,您可能必須推出自己的類。

使用boost可以很容易地使用最小的迭代器:

#include <boost/iterator/iterator_facade.hpp>

using namespace boost;

struct Int100
{
    int arr[100];

    struct iterator : iterator_facade<iterator,int,forward_traversal_tag>
    {
        iterator( int* p = nullptr ) : p(p) {}
        void increment() { ++p; }
        bool equal(const iterator& other) const { return p == other.p; }
        int& dereference() const { return *p; }
        int* p;
    };

    iterator begin() { return {arr}; }
    iterator end() { return {arr+100}; }

};

這支持您在尋找的*++begin()語法。

暫無
暫無

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

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