3

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

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

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

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

4

1 回答 1

5

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

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

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

于 2012-12-28T00:06:45.500 回答