首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向访问元素的解引用向量指针

指向访问元素的解引用向量指针
EN

Stack Overflow用户
提问于 2009-12-16 06:02:09
回答 2查看 93.7K关注 0票数 72

如果我在C++中有一个指向向量的指针:

代码语言:javascript
复制
vector<int>* vecPtr;

我想要访问向量的一个元素,然后我可以通过取消引用向量来实现:

代码语言:javascript
复制
int a = (*vecPtr)[i];

但是,这种取消引用实际上会在堆栈上创建向量的副本吗?假设向量存储了10000个整数,那么通过取消引用vecPtr 10000个整数会被复制吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-16 06:10:14

10000不会复制int%s。解除引用是非常便宜的。

为了说明这一点,您可以重写

代码语言:javascript
复制
int a = (*vecPtr)[i];

作为

代码语言:javascript
复制
vector<int>& vecRef = *vecPtr; // vector is not copied here
int a = vecRef[i];

此外,如果您担心存储在vector中的整个数据将位于堆栈中,并且使用vector<int>*而不是vector<int>来避免这种情况:情况并非如此。实际上,堆栈上只使用了固定数量的内存(大约16-20字节,具体取决于实现),与vector中存储的元素数量无关。vector本身在堆上分配内存和存储元素。

票数 89
EN

Stack Overflow用户

发布于 2009-12-16 06:10:30

不,不会复制任何内容;取消引用只会告诉C++您想要在向量上调用operator[],而不是在指针vecPtr上调用。如果您没有取消引用,C++将尝试查找在std::vector<int>*类型上定义的operator[]。

这可能会让人很困惑,因为operator[]是为所有指针类型定义的,但它相当于偏移指针,就好像它指向一个vector<int>数组一样。如果您真的只在那里分配了一个向量,那么对于除0之外的任何索引,表达式的计算结果都是对垃圾的引用,因此您将得到一个段错误或您没有预料到的结果。

一般来说,通过指针访问向量是一件痛苦的事情,而且(*vecPtr)[index]语法也很笨拙(但比vecPtr->operator[](index)好)。相反,您可以使用:

代码语言:javascript
复制
vecPtr->at(index)

这实际上是检查范围,不像operator[],所以如果您不想为检查索引是否在范围内而付出代价,那么您就只能使用(*vecPtr)[]了。

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

https://stackoverflow.com/questions/1910712

复制
相关文章

相似问题

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