gpt4 book ai didi

c++:交换 vector 和指针失效?

转载 作者:太空狗 更新时间:2023-10-29 20:43:58 36 4
gpt4 key购买 nike

我似乎在交换两个 vector 的元素时遇到了问题。我有两个 vector ,xy,它们包含 myclass 类型的对象。 myclass 只有一个公共(public)成员 w。我创建了一个指针 vector ,指向 x 的成员 w,然后交换 vector xy。我希望指针 vector 仍指向 xw 成员,但情况似乎并非如此。

这是重现我的问题的一个简单示例。

#include <iostream>
#include <vector>

using namespace std;

struct myclass
{
double w;
};


int main()
{
vector<myclass> x(10);
for(int i=0; i!=10; i++) x[i].w = i;
for(auto el : x) std::cout << el.w << std::endl; /* prints i */
std::cout << std::endl;

vector<double *> px(10);
for(int i=0; i!=10; i++) px[i] = &x[i].w;
for(auto el : px) std::cout << *el << std::endl; /* prints i */
std::cout << std::endl;

vector<myclass> y(10);
for(int i=0; i!=10; i++) y[i].w = 2*i;
for(auto el : y) std::cout << el.w << std::endl; /* prints 2*i */
std::cout << std::endl;

y.swap(x);

for(auto &el : x) std::cout << &el.w << " " << el.w << std::endl; /* prints 2*i as it should */
std::cout << std::endl;

for(auto &el : px) std::cout << el << " " << *el << std::endl; /* should print 2*i, but prints i */
std::cout << std::endl;
}

注意 xy 已经交换了元素,但是 px 仍然指向旧元素。我读到使用 swap 不应该使指针/迭代器无效。这是正确的还是我遗漏了什么?提前致谢!

最佳答案

指针和迭代器不会失效,但它们会跟随容器的内容。

x 的内容被交换到 y 中,但是指向这些值的迭代器和指针将继续指向它们(即使它们现在在 y)。

想一想,它怎么能以其他方式工作呢?如果交换两个长度不等的容器,那么指向较长容器末尾附近元素的指针会指向较短容器中的什么?如果必须在内存中移动每个容器的元素以确保指针保持有效,如何在 O(1) 中实现 swap()

关于c++:交换 vector 和指针失效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14062858/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com