其他分享
首页 > 其他分享> > c:交换向量和指针失效?

c:交换向量和指针失效?

作者:互联网

我似乎在交换两个向量的元素时遇到了问题.我有两个向量,x和y,它们包含myclass类型的对象. myclass只有一个公共成员w.我创建了一个指向x的成员w的指针向量,然后交换向量x和y.我希望指针的向量仍然指向x的w成员,但似乎并非如此.

这是一个重现我的问题的简单例子.

#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;
}

请注意,x和y已交换元素,但px stills指向旧元素.我读到使用swap不应该使指针/迭代器无效.这是正确的还是我错过了什么?
提前致谢!

解决方法:

指针和迭代器不会失效,但它们遵循容器的内容.

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

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

标签:invalidation,c,pointers,swap
来源: https://codeday.me/bug/20190901/1783061.html