我有一个 std::vector<int>
和一个指针 int*
指向 vector 中的一个元素。假设指针指向第三个元素:pointer=&vector.at(2)
.如果我现在对 vector 进行洗牌,它是否仍会指向同一个元素(第三个),还是会指向曾经是第三个元素现在已移动的新位置?
在那之后,我想让这个问题更笼统一点:当 vector 扩展或缩减时,指向 vector 中元素的指针和迭代器的行为如何?
最佳答案
指针将继续指向相同的位置,因此当您随机播放时,它会指向已移动到您指定位置的任何元素。
当您扩展 vector 的大小时,所有现有的指向 vector 的指针和迭代器都可能变得无效。当您洗牌时,它们会继续引用相同的位置,该位置(通常)包含与洗牌前不同的值。
减小 vector 的大小将取决于您如何做到这一点。一种方法是创建一个临时 vector 作为当前 vector 的拷贝,交换两者,然后销毁临时 vector (通常是隐式地,通过让它超出范围)。如果你这样做,指针将进入临时的,并在它被销毁时失效。
如果您使用 shrink_to_fit
(可能)不会使迭代器/指针无效,但可能没有任何效果(标准指定它是非绑定(bind)请求,并且没有说明任何内容关于它使迭代器/指针无效)。
关于c++ - 当我洗牌时,指向 vector 中元素的指针会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28684573/