如何使指针在 std::set 中有效?

How can make pointer valid in std::set?

我有一个自定义结构,我重载了运算符 >:

struct A {
  A(int a) : a_(a) {}
  int a_;
  friend operator > (const A& a) const {
    return a_ > a.a_; 
  }
};

所以我可以将此结构推送到 stl 容器集中:

std::set<A> s;
s.insert(A(3));
s.insert(A(5));
s.insert(A(4));

但我正在做一个大任务,这意味着,复制操作对我来说是昂贵的。

所以,我想用这样的指针元素类型构建一个集合:

std::set<A*>s;
A a(3); A b(5); A c(4);
s.insert(&a); s.insert(&b); s.insert(&c);

但是我发现保序失败,请问有什么方法可以通过元素指针保序吗?

或者,如何将元素保存在有序容器中,无需复制并具有良好的性能?

使用自定义比较器:

#include <iostream>
#include <set>

struct CustomCmp {
    bool operator()(const int* lhs, const int* rhs) const { 
        return *lhs < *rhs;
    }
};

int main()
{
    int arr[] = { 3, 1, 4 };

    std::set<int*, CustomCmp> mySet;
    mySet.insert(&arr[0]);
    mySet.insert(&arr[1]);
    mySet.insert(&arr[2]);

    for (auto& el: mySet) std::cout << *el << ' '; // 1, 3, 4

    return 0;
}

https://godbolt.org/z/zGc1a3