我想对 C++ 数组使用迭代器,但也要使用原始指针。我可以使用静态向量:
#define SIZE 10
int vect[SIZE] = {0};
vect[3] = 5;
int* p = std::find(std::begin(vect), std::end(vect), 5);
bool success = p != std::end(vect);
Run Code Online (Sandbox Code Playgroud)
如何使用原始指针(可能是堆分配的向量)来做到这一点?当然编译器不知道数据的大小,所以这段代码
int* pStart = vect;
std::find(std::begin(pStart), std::end(pStart), 5);
Run Code Online (Sandbox Code Playgroud)
给
error C2784: '_Ty *std::begin(_Ty (&)[_Size])' :
could not deduce template argument for '_Ty (&)[_Size]' from 'int *'
Run Code Online (Sandbox Code Playgroud)
是否有可能做出begin()并end()意识到它?
是否可以让 begin() 和 end() 意识到它?
std::begin对于一个指针是可以实现的,但是实现是不可能的std::end(因为你说的大小是未知的),所以有点无意义。
但是,您不需要使用其中任何一个std::find:
int* p = std::find(pStart, pStart + SIZE, 5);
Run Code Online (Sandbox Code Playgroud)
不,不可能在指针上使用std::beginand 。std::end与大小是类型的一部分并因此可推论的数组不同,指针不保存它所指向的对象的大小。在您使用指针的情况下,您必须使用
std::find(pStart, pStart + SIZE, 5);
Run Code Online (Sandbox Code Playgroud)
避免这种情况的方法是std::vector当您不知道编译时 szie 是什么时使用。它将为您管理内存并提供begin成员end函数。