我有一个std::set<std::pair<Point, double>> my_set
和一个向量std::vector<std::pair<Point, double>*> my_vec
,它包含指向集合中元素的指针。 my_set
和my_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_set
和my_vec
是类的成员,方法A也来自该类。我的结果是错误的,因为配对对象仅在该方法的上下文中有效并且使方法无效吗?我有点被困在这里。提前谢谢!
答案 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插入和安置成员不应影响迭代器的有效性和对容器的引用, 擦除成员只能使迭代器和对擦除元素的引用无效。
恕我直言,你最好将迭代器存储在你的矢量中。