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

How to keep a pointer to a object which is inserted into a set and then pushed into a vector?

本文关键字:然后 向量 何保留 指针 对象 集合 保留 插入      更新时间:2023-10-16

我有一个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 也来自该类。我的结果是错误的,因为 pair 对象仅在该方法的上下文中有效,并且通过离开该方法它变得无效?我有点被困在这里了。提前感谢!

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

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

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 关联容器 [associaciative.reqmts]
...
9 插入和放置成员不得影响迭代器和对容器的引用的有效性, 并且擦除成员应仅使迭代器和对擦除元素的引用无效。

所以恕我直言,你最好在你的向量中存储迭代器。

相关文章: