我想对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);如何能够使用原始指针(可能是堆分配的向量)来完成这个任务?当然,编译器不知道数据的大小,所以这段代码
int* pStart = vect;
std::find(std::begin(pStart), std::end(pStart), 5);给出
error C2784: '_Ty *std::begin(_Ty (&)[_Size])' :
could not deduce template argument for '_Ty (&)[_Size]' from 'int *'是否有可能让begin()和end()知道这一点?
发布于 2017-01-31 16:51:01
不,不可能在指针上使用std::begin和std::end。与数组不同的是,数组的大小是类型的一部分,因此,指针不包含它所指向的东西的大小。在这种情况下,您必须使用指针。
std::find(pStart, pStart + SIZE, 5);但是,避免这种情况的方法是在编译时不知道szie将是什么时使用std::vector。它将为您管理内存,并提供begin和end成员函数。
发布于 2017-01-31 16:50:12
是否有可能让begin()和end()知道这一点?
可以为指针实现std::begin,但不可能实现std::end (正如您所说的,大小未知),因此它有点没有意义。
但是,您不需要任何一个都可以使用std::find
int* p = std::find(pStart, pStart + SIZE, 5);发布于 2017-01-31 16:49:44
在此:
std::begin(pStart), std::end(pStart)你想取指针的开头和结尾。不是的!
相反,你的意思是:
std::begin(vect), std::end(vect)无论您使用数组、std::array、std::vector还是特别大的大象,这都是一样的--为了获得容器的边界,您需要容器。
https://stackoverflow.com/questions/41962903
复制相似问题