如何对stl集合中的指针进行排序? 在C++中,SET可以自动对值进行排序,所以我只需要插入它们。

如何对stl集合中的指针进行排序? 在C++中,SET可以自动对值进行排序,所以我只需要插入它们。,c++,stl,C++,Stl,对于自定义结构,我只需要定义操作符>和shot2.a; } INTA_; }; int main(int argc,字符**argv){ std::集s; A a1(10)、a2(11)、a3(9); s、 插入(a1); s、 插入(a2); s、 插入(a3); 用于(自动i:s){ cout shot 2.a_; } INTA_; }; int main(int argc,字符**argv){ std::集s; A a1(10)、a2(11)、a3(9); s、 插入(&a1); s、 插

对于自定义结构,我只需要定义操作符>和shot2.a; } INTA_; }; int main(int argc,字符**argv){ std::集s; A a1(10)、a2(11)、a3(9); s、 插入(a1); s、 插入(a2); s、 插入(a3); 用于(自动i:s){ cout shot 2.a_; } INTA_; }; int main(int argc,字符**argv){ std::集s; A a1(10)、a2(11)、a3(9); s、 插入(&a1); s、 插入(&a2); s、 插入(&a3); 用于(自动i:s){
cout a\up>集合不再是对象
a
,而是指针:
a*
。因此,集合的默认顺序是在指针转换为整数时执行的,它是在内存中对其位置进行排序。为了避免这种情况,需要使用自定义比较运算符,它绕过实例的所需顺序

您可以定义自己的比较函数,如下例所示

其思想是创建一个函子:一个具有运算符括号的结构,并实现所需对象之间的比较(小于):

bool operator()(Obj a, Obj b); //Less comparison.
然后,可以在集合的模板中使用该类:

#include <iostream>
#include <cmath>
#include <set>

using namespace std;

struct A {   // NOTICE HERE: A's contructor is very heavy
  A(int a) : a_(a) {}
  friend bool operator <(const A& shot1, const A& shot2) {
    return shot1.a_ < shot2.a_;
  }
  friend bool operator >(const A& shot1, const A& shot2) {
    return shot1.a_ > shot2.a_;
  }
  int a_; 
};

struct Comp
{
    bool operator()(const A* a, const A* b)
    {
        if (a && b)
        {
            return *a < *b;
        }
        return a<b;
    }
};

int main(int argc, char** argv) {
  std::set<A*, Comp> s;
  A a1(10), a2(11), a3(9);
  s.insert(&a1);
  s.insert(&a2);
  s.insert(&a3);
  for (auto i : s) {
    cout << i->a_ << endl;  // 10, 11, 9, not sorted!!!!!!!
  }
}
#包括
#包括
#包括
使用名称空间std;
结构A{//注意:A的构造函数非常重
A(inta):A_u(A){
friend bool操作员(常数A和shot1,常数A和shot2){
返回快照1.a_u>shot2.a_uu;;
}
INTA_;
};
结构组件
{
布尔运算符()(常数A*A,常数A*b)
{
如果(a&b)
{
返回*a<*b;
}
归还
bool operator()(Obj a, Obj b); //Less comparison.
#include <iostream>
#include <cmath>
#include <set>

using namespace std;

struct A {   // NOTICE HERE: A's contructor is very heavy
  A(int a) : a_(a) {}
  friend bool operator <(const A& shot1, const A& shot2) {
    return shot1.a_ < shot2.a_;
  }
  friend bool operator >(const A& shot1, const A& shot2) {
    return shot1.a_ > shot2.a_;
  }
  int a_; 
};

struct Comp
{
    bool operator()(const A* a, const A* b)
    {
        if (a && b)
        {
            return *a < *b;
        }
        return a<b;
    }
};

int main(int argc, char** argv) {
  std::set<A*, Comp> s;
  A a1(10), a2(11), a3(9);
  s.insert(&a1);
  s.insert(&a2);
  s.insert(&a3);
  for (auto i : s) {
    cout << i->a_ << endl;  // 10, 11, 9, not sorted!!!!!!!
  }
}