C++ 从指针返回迭代器
我有两个简单的容器:一个存储指针,另一个存储一组指针。为了能够在这两种算法(或stl算法)上使用for(auto…),我想为它们添加begin/end。对于具有flat_集的容器,我只需要返回flat_集的迭代器,但是如何对只包含指针的容器执行相同的操作 我想避免仅仅为了这个而创建一个完整的迭代器类。。。基本上,我想这样做:C++ 从指针返回迭代器,c++,pointers,iterator,C++,Pointers,Iterator,我有两个简单的容器:一个存储指针,另一个存储一组指针。为了能够在这两种算法(或stl算法)上使用for(auto…),我想为它们添加begin/end。对于具有flat_集的容器,我只需要返回flat_集的迭代器,但是如何对只包含指针的容器执行相同的操作 我想避免仅仅为了这个而创建一个完整的迭代器类。。。基本上,我想这样做: class Container { ... Iterator begin() { return the_pointer; } Iterator en
class Container
{
...
Iterator begin() { return the_pointer; }
Iterator end() { return the_pointer+1; }
private:
int* the_pointer;
}
但我不知道迭代器必须具有哪个签名
谢谢 指向对象类型的指针是有效的迭代器类型,因此您可以只返回一个指针。实际上,
std::array
将T*
作为其迭代器类型。指向对象类型的指针是有效的迭代器类型,因此您可以只返回一个指针。实际上,std::array
的迭代器类型是T*
。如果容器包含指针序列(它们像普通数组一样存储在内存中),那么您只需从类返回指针即可
int * begin();
int * end();
这是因为for(…:…)语法扩展为如下内容:
for ( auto begin = container.begin(), end = container.end();
begin != end; ++begin )
// ...
若您的容器包含指针序列(它们像普通数组一样存储在内存中),那个么您可以简单地从类返回指针
int * begin();
int * end();
这是因为for(…:…)语法扩展为如下内容:
for ( auto begin = container.begin(), end = container.end();
begin != end; ++begin )
// ...
C指针是合法的迭代器。您可以查看一个关于如何从指针实现迭代器的有用指南。基本上,您需要实现
begin()
和end()
返回第一个和最后一个有效指针。C指针是合法的迭代器。您可以查看一个关于如何从指针实现迭代器的有用指南。基本上,您需要实现begin()
和end()
返回第一个和最后一个有效指针。但我不知道迭代器必须具有哪个签名。这是什么意思?只需包含typedefint*迭代器;typedef const int*常量迭代器在类定义中使用code>并返回指针。但我不知道迭代器必须具有哪个签名。这是什么意思?只需包含typedefint*迭代器;typedef const int*常量迭代器在类定义中编写>并返回指针。好的,但是当我这样做时,为什么我得到的是int而不是int*?我的意思是我必须为(int&I:container)而不是为(int*I:container)编写代码。@user52730:如果你想迭代指针,而不是它们指向的值,你需要将begin()
和end()
函数定义为:int**begin()
和int**end()
。啊,是的,差不多了:)它对begin有效,但是如何结束,因为这是非法的:int**end(){return&(the_pointer+1)}?为了确定,我为begin做了这件事:int**begin(){return&the_pointer;},可以吗?@user52730:如果你想一次只存储一个指针,你不应该实现begin()
/end()
方法,因为它没有意义。您应该创建一些类似get方法的东西(如果您想访问它),或者使用。好的,但是当我这样做时,为什么我得到的是int而不是int*?我的意思是我必须为(int&I:container)而不是为(int*I:container)编写代码。@user52730:如果你想迭代指针,而不是它们指向的值,你需要将begin()
和end()
函数定义为:int**begin()
和int**end()
。啊,是的,差不多了:)它对begin有效,但是如何结束,因为这是非法的:int**end(){return&(the_pointer+1)}?为了确定,我为begin做了这件事:int**begin(){return&the_pointer;},可以吗?@user52730:如果你想一次只存储一个指针,你不应该实现begin()
/end()
方法,因为它没有意义。您应该制作一些类似get方法的东西(如果您想访问它),或者使用。谢谢您的指导!只是为了澄清,end()
实际上应该在最后一个有效指针之后返回指针。感谢您的指导!只是为了澄清,end()
实际上应该在最后一个有效指针之后返回指针。