STL自定义排序准则
STL自定义排序准则 STL(Standard Template Library)是C++编程中非常重要的一部分,对于C++编程者来说, STL 的排序准则是一个非常重要的概念。今天,我们将讨论STL自定义排序准则的实现方法。 我们来看一下STL中的排序准则。STL中有多种容器,例如vector、list、set、map等,每种容器都有其自己的排序准则。例如,vector的排序准则是按照元素的自然顺序排序,而set和multiset的排序准则是按照元素的键值排序。 那么,如何自定义STL的排序准则呢?答案是使用operator<运算符。operator<运算符是C++中的一个运算符,它用来比较两个对象的大小。如果我们定义了一个类,该类重载了operator<运算符,那么我们就可以使用该类作为STL容器的键值,并按照我们定义的排序准则排序。 下面是一个简单的示例代码,展示了如何使用operator<运算符来自定义STL的排序准则: ```cpp class T { private: int x; double y; public: T(int X, double Y) : x(X), y(Y) {} double getXY() const { return ((double)x + y); } bool operator< (T t) const { return (x + y) < t.getXY(); } void print() const { cout << "x = " << x << " y = " << y << " x + y = " << getXY() << endl; } }; int main() { T t1 = T(1, 3.2); T t2 = T(2, 1.1); T t3 = T(100, 0.1); T t4 = T(1, 2.1); multiset<T> set_T; set_T.insert(t1); set_T.insert(t2); set_T.insert(t3); set_T.insert(t4); multiset<T>::const_iterator it; for (it = set_T.begin(); it != set_T.end(); ++it) { it->print(); } return 0; } ``` 在上面的代码中,我们定义了一个类T,该类有两个成员变量x和y,並重载了operator<运算符。operator<运算符按照x+y的值来比较两个对象的大小。然后,我们使用multiset容器来存储T对象,并按照我们定义的排序准则排序。 现在,假设我们有一个类Account,该类有两个成员变量id_account和money,我们想按照money的值来排序Account对象。我们可以使用multimap容器来存储Account对象,并使用operator<运算符来自定义排序准则。 ```cpp typedef int ID_CARD; struct Account { int id_account; int money; }; typedef std::multimap<ID_CARD, Account*> AMap; AMap a; Account *a1 = new Account; Account *a2 = new Account; Account *a3 = new Account; Account *a4 = new Account; Account *a5 = new Account; a.insert(make_pair(1, a1)); a.insert(make_pair(1, a2)); a.insert(make_pair(2, a3)); // ... pair<AMap::iterator, AMap::iterator> account_range = a.equal_range(1); // 如何按照Account->money的值来排序account_range中的值? ``` 要解决这个问题,我们可以使用vector和sort函数来实现。我们将account_range中的值存储到一个vector中,然后使用sort函数按照Account->money的值来排序。 ```cpp std::vector<Account*> account_vec; for (AMap::iterator it = account_range.first; it != account_range.second; ++it) { account_vec.push_back(it->second); } std::sort(account_vec.begin(), account_vec.end(), [](Account* a, Account* b) { return a->money < b->money; }); ``` 这样,我们就可以按照Account->money的值来排序account_range中的值。 在STL中,map和multimap的键值可以是结构体,这时我们需要使用operator<运算符来自定义排序准则。例如: ```cpp typedef struct tagRoadKey { int nType; int nScale; } RoadKey; typedef std::map<RoadKey, int> RoadMap; RoadMap road_map; road_map[ RoadKey{1, 2} ] = 10; road_map[ RoadKey{2, 3} ] = 20; road_map[ RoadKey{1, 1} ] = 30; // ... struct RoadKeyCompare { bool operator()(const RoadKey& a, const RoadKey& b) const { if (a.nType != b.nType) { return a.nType < b.nType; } else { return a.nScale < b.nScale; } } }; RoadMap road_map( RoadKeyCompare() ); ``` 在上面的代码中,我们定义了一个结构体RoadKey,该结构体有两个成员变量nType和nScale。然后,我们使用map容器来存储RoadKey对象,并使用RoadKeyCompare结构体来自定义排序准则。RoadKeyCompare结构体按照nType和nScale的值来比较两个RoadKey对象的大小。 STL的排序准则是非常重要的概念,通过使用operator<运算符和自定义排序准则,我们可以实现复杂的排序规则,提高编程的效率和灵活性。