首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stl::带有原始指针的迭代器

stl::带有原始指针的迭代器
EN

Stack Overflow用户
提问于 2017-01-31 16:46:00
回答 6查看 6.5K关注 0票数 4

我想对C++数组使用迭代器,但也使用原始指针。我可以用一个静态向量:

代码语言:javascript
复制
#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);

如何能够使用原始指针(可能是堆分配的向量)来完成这个任务?当然,编译器不知道数据的大小,所以这段代码

代码语言:javascript
复制
int* pStart = vect;
std::find(std::begin(pStart), std::end(pStart), 5);

给出

代码语言:javascript
复制
error C2784: '_Ty *std::begin(_Ty (&)[_Size])' : 
could not deduce template argument for '_Ty (&)[_Size]' from 'int *'

是否有可能让begin()end()知道这一点?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-01-31 16:51:01

不,不可能在指针上使用std::beginstd::end。与数组不同的是,数组的大小是类型的一部分,因此,指针不包含它所指向的东西的大小。在这种情况下,您必须使用指针。

代码语言:javascript
复制
std::find(pStart, pStart + SIZE, 5);

但是,避免这种情况的方法是在编译时不知道szie将是什么时使用std::vector。它将为您管理内存,并提供beginend成员函数。

票数 4
EN

Stack Overflow用户

发布于 2017-01-31 16:50:12

是否有可能让begin()和end()知道这一点?

可以为指针实现std::begin,但不可能实现std::end (正如您所说的,大小未知),因此它有点没有意义。

但是,您不需要任何一个都可以使用std::find

代码语言:javascript
复制
int* p = std::find(pStart, pStart + SIZE, 5);
票数 5
EN

Stack Overflow用户

发布于 2017-01-31 16:49:44

在此:

代码语言:javascript
复制
std::begin(pStart), std::end(pStart)

你想取指针的开头和结尾。不是的!

相反,你的意思是:

代码语言:javascript
复制
std::begin(vect), std::end(vect)

无论您使用数组、std::arraystd::vector还是特别大的大象,这都是一样的--为了获得容器的边界,您需要容器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41962903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档