如何在向量中的元素上进行指针/引用?

新手上路,请多包涵

我有两个向量,对于某些元素(不是全部),我需要将它们连接起来〜如果我在一个向量中删除/更改此元素,则应该在两个向量中都删除/更改。

类似指针的东西:

 int r = 10;
int *p= &r;
*p = 3;

例如,在下一个代码中,它应该将 myvector2[0].a 更改为 7。

 #include <iostream>
#include <vector>

using namespace std;

struct elt {
    int a, b, c;
};

int main()
{

    vector<elt> myvector;
    vector <elt> myvector2;
    elt elt1 = {1,3,3};

    myvector.push_back(elt1);
    elt *elt2 = &elt1;
    myvector2.push_back(*elt2);

    myvector[0].a=7;

    cout << myvector[0].a << endl; //7
    cout << myvector2[0].a << endl; //1

    return 0;
}

我怎样才能做到这一点?请帮忙!!!

原文由 dropky 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 565
2 个回答

正如 tgmath 所解释的,问题在于您最终会在向量中使用两个不同的对象,因为标准容器按值存储元素。我建议您使用共享指针来正确维护对象的生命周期(注意这使用 C++11 特性):

 #include <iostream>
#include <vector>
#include <memory>

struct elt {
    int a, b, c;
};

int main()
{
    std::vector<std::shared_ptr<elt>> myvector;
    std::vector<std::shared_ptr<elt>> myvector2;
    auto elt1 = std::make_shared<elt>(elt {1,3,3});

    myvector.push_back(elt1);
    myvector2.push_back(elt1);

    myvector[0]->a=7;

    std::cout << myvector[0]->a << std::endl; //7
    std::cout << myvector2[0]->a << std::endl; //7

    return 0;
}

原文由 Dark Falcon 发布,翻译遵循 CC BY-SA 3.0 许可协议

每当向量重新分配时,指向 std::vector 元素的指针和引用(和迭代器)都会失效,这可能在插入期间发生。因此,只有在保证向量不会在指针/引用的生命周期内重新分配时,您才能保留这些。如果您不插入向量,或者如果您在开始之前(以及在获取指针/引用/迭代器之前)调用 reserve() ,则可以实现这一点,扩展其容量以便没有重新分配将是必要的。

如果你不能保证,你唯一的选择是保留索引而不是指针/引用。当然,您还需要访问向量本身才能使其工作,但您应该能够保留指向它的指针或引用,例如

typedef std::pair<std::vector<elt>*, size_t> ReferenceIntoVector;

原文由 Angew is no longer proud of SO 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题