取消引用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)[]
。