如何保持指向插入到集合中然后推入向量的对象的指针?

时间:2016-03-20 15:45:30

标签: c++ pointers vector set

我有一个std::set<std::pair<Point, double>> my_set和一个向量std::vector<std::pair<Point, double>*> my_vec,它包含指向集合中元素的指针。 my_setmy_vec是班级的成员。

我还有一堆新的Point我要插入到集my_set中,并与值(double)配对。我不知道如何保持指向std::pair<Point, double>对象的指针以将此指针推送到my_vec

如果我在方法A中执行以下操作:

auto pair = std::pair<Point(1,2), 0.2>; my_set.insert(pair); my_vec.push_back(&pair);

我最终得到了错误的对,甚至是无效的对。应该注意的是,my_setmy_vec是类的成员,方法A也来自该类。我的结果是错误的,因为配对对象仅在该方法的上下文中有效并且使方法无效吗?我有点被困在这里。提前谢谢!

1 个答案:

答案 0 :(得分:1)

集合(与标准库中的所有迭代器一样)存储对象的副本。这意味着你应该存储对象的初始地址。

您可以尝试将元素的地址存储在集合中:

auto pair = std::pair<Point(1,2), 0.2>;
auto it = my_set.insert(pair).first;
my_vec.push_back(&(*it));

但我无法保证元素的地址保持不变。我只能在标准草案n2496中看到

  

23.2.4关联容器[associative.reqmts]
...
  9插入和安置成员不应影响迭代器的有效性和对容器的引用,   擦除成员只能使迭代器和对擦除元素的引用无效。

恕我直言,你最好将迭代器存储在你的矢量中。