取消引用vector指针访问元素

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

vector<int>* vecPtr; 

而我想访问vector的元素,那么我可以通过去除vector来做到这一点:

 int a = (*vecPtr)[i]; 

但是这个解引用实际上是在栈上创build一个我的向量的副本? 让我们说vector存储10000整数,将通过取消引用vecPtr 10000整数被复制?

谢谢!

10000个int不会被复制。 解引用非常便宜。

要清楚你可以重写

 int a = (*vecPtr)[i]; 

 vector<int>& vecRef = *vecPtr; // vector is not copied here int a = vecRef[i]; 

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

不,没有任何东西会被复制; 解引用只是告诉C ++你想在vector上调用operator [],而不是在你的指针 vecPtr 。 如果你没有取消引用,C ++会尝试寻找在std::vector<int>*types上定义的operator []。

这可能会让人困惑,因为operator[]是为所有指针types定义的,但是它相当于指向一个vector<int>的数组。 如果你真的只在这里分配了一个单独的向量,那么对于任何非0索引,expression式的计算结果都是对垃圾的引用,所以你会得到一个段错误或者你没有想到的东西。

一般来说,通过指针访问向量是一个痛苦,而(*vecPtr)[index]语法是尴尬的(但比vecPtr->operator[](index) )更好。 相反,您可以使用:

 vecPtr->at(index) 

这实际上检查范围,不像operator[] ,所以如果你不想支付价格检查索引是否在界限,你坚持(*vecPtr)[]