C++ 如何将指针作为迭代器返回?
我需要实现迭代器,而且我没有时间创建好的迭代器类,所以我决定只返回指针。是这样的C++ 如何将指针作为迭代器返回?,c++,function,return-value,lvalue,C++,Function,Return Value,Lvalue,我需要实现迭代器,而且我没有时间创建好的迭代器类,所以我决定只返回指针。是这样的 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;
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
*++begin();//无法工作,因为返回的指针不是l值
std::向量vi{0,1};
*++vi.begin();//很好
int*p=begin();
*++p、 //效果也不错
我如何做到这一点?指针确实完全满足迭代器要求(指针甚至满足最专业的随机访问迭代器要求)。您的问题来自这样一个事实:在您正在使用的标准库的实现中,例如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}; }
};
#包括
使用名称空间boost;
结构Int100
{
int-arr[100];
结构迭代器:迭代器
{
迭代器(int*p=nullptr):p(p){}
void increment(){++p;}
bool equal(const iterator&other)const{return p==other.p;}
int&dereference()常量{return*p;}
int*p;
};
迭代器begin(){return{arr};}
迭代器end(){return{arr+100};}
};
这支持您在何处查找的
*++begin()
语法。那么您必须咬紧牙关,编写一个合适的迭代器类。@Luke我刚刚编写了一个示例,但它们不会。@MatsKindahl我不确定该示例是否更清晰。它显示了使用普通指针作为迭代器时与使用用户定义类型时的工作方式不同的示例。@Yola-向量示例恰好工作,因为迭代器是类对象。标准不要求这样。如果允许使用Boost,那么在原始指针上使用Boost.IteratorIterator\u facade
对于一个真正的迭代器类来说几乎是两行代码。