[英]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.