STL中sort、priority_queue、map、set的自定义比较函数

这篇博客介绍了STL中sort、priority_queue、map和set如何使用自定义比较函数。默认情况下,这些容器遵循less原则进行排序。sort进行升序排序,priority_queue作为大顶堆,map和set则小值优先。通过自定义比较函数,可以改变它们的排序逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL中,sort的默认排序为less,也就是说从小到大排序;priority_queue默认是less,也就说大顶堆;map默认是less,也就说用迭代器迭代的时候默认是小的排在前面;set默认是less,也就是说用迭代器迭代的时候是从小到大排序的。

1、sort

#include <stdio.h>
#include <algorithm>
#include <functional>
using namespace std;

bool comp(const int& a, const int& b ){
    return a < b ; //从小到大
}
struct cmp{
    bool operator()( const int& a , const int& b ) const{
        return a < b ;      //从小到大
    }
} ;

int main(){
    int array[] = {1 ,5 ,4, 10 , 3, 6 }  ;
    sort( array , array+6 ) ; //以默认的less<int>()排序
    sort( array , array+6 , greater<int>() ) ;  //从大到小排序
    sort( array , array+6 , comp ) ;
    sort( array , array+6 , cmp() ) ;
    for(int i=0;i<6;++i)    printf("%d ",array[i]); printf("\n");
    return 0 ;
}

2、priority_queue

#include <stdio.h>
#include <queue>
using namespace std ;

struct cmp{
    bool operator()( const int& a , const int& b )const{
        return a < b ;      //大顶堆
    }
};
struct Node{
    int x, y ;
    Node(int _x, int _y ):x(_x),y(_y){}
    bool operator <(const Node& n1)const{
        if( x < n1.x )    return true ;     //按照x为第一关键字由大到小排序
        else if( x == n1.x )   return y < n1.y  ;   //y为第二关键字由大到小排序
        else    return false ;
    }
} ;

int main(){
    //priority_queue<int> q ; //优先队列默认是less,大顶堆 ;
    //priority_queue<int,vector<int> ,cmp> q ;
    priority_queue< Node > q ;

    for(int i=0;i<10;i++)   q.push( Node( rand() , rand() ) );
    while( !q.empty() ){
        printf("%d %d\n",q.top().x , q.top().y ) ;
        q.pop() ;
    }
    return 0 ;
}

3、map

#include<stdio.h>
#include <map>
using namespace std;

struct cmp{
    bool operator()( const int& a, const int& b ) const{
        return a < b ; //从小到大;
    }
};
int main(){
    //map<int, int,greater<int> > mp ;  //从大到小
    map<int , int ,cmp> mp ;
    for(int i=0;i<10;++i)   mp.insert( map<int,int,cmp >::value_type(rand() ,i) ) ;
    map<int, int, cmp >::iterator it = mp.begin() ;
    for( ;it!=mp.end() ;it++)   printf("%d %d\n",(*it).first , (*it).second );
    return 0 ;
}


4、set

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set>

using namespace std;

struct cmp{
    bool operator()( const int& a , const int& b )const{
        return a < b ; //从小到大
    }
} ;

int main(){
    //set<int > s ;
    set<int,cmp> s ;
    for(int i=0;i<10;i++)   s.insert( rand() ) ;
    set<int,cmp>::iterator it = s.begin() ;
    for( ; it!=s.end();it++)
        printf("%d\n",*it);
    return 0 ;
}



好的,下面将为您展示一段综合运用了 `vector`, 栈 (`stack`), 队列 (`queue`), 优先队列 (`priority_queue`), 双向链表 (`list`), `set`, `map`, 排序算法 (`sort`) 和排列组合生成器 (`next_permutation`) 的 C++ 程序示例。这个程序的功能是从一组整数中找到所有可能的不同排序结果,并统计每个数字出现的频率。 ```cpp #include <iostream> #include <vector> #include <stack> #include <queue> #include <list> #include <set> #include <map> #include <algorithm> // for sort and next_permutation using namespace std; int main() { vector<int> numbers = {4, 2, 6}; // 初始数据集 // 创建并操作各种容器 stack<int> s; // 后进先出 (LIFO) queue<int> q; // 先进先出 (FIFO) list<int> l(numbers.begin(), numbers.end()); // 双向链表初始化 set<int> unique_set(numbers.begin(), numbers.end()); // 自动去除重复元素 map<int, int> frequency_map; // 记录各元素出现次数 priority_queue<int> pq; // 默认最大堆 // 将初始数据放入各个容器中 for (auto num : numbers) { s.push(num); q.push(num); ++frequency_map[num]; // 统计频次 pq.push(num); } // 打印原始数组及其排好序的形式 cout << "Original array: "; for_each(begin(numbers), end(numbers), [](int n){cout << n << ' ';}); cout << "\nSorted array: "; sort(begin(numbers), end(numbers)); // 对原数组进行升序排序 for_each(begin(numbers), end(numbers), [](int n){cout << n << ' ';}); cout << '\n'; // 展示所有的全排列形式 do { for(auto& elem : numbers){ cout << elem << ' '; } cout << '\n'; } while(next_permutation(begin(numbers), end(numbers))); // 获取下一个排列 // 操作其他容器的内容 cout << "\nPopping from Stack(LIFO):"; while (!s.empty()) { cout << ' ' << s.top(); s.pop(); } cout << "\nPopping from Queue(FIFO):"; while (!q.empty()) { cout << ' ' << q.front(); q.pop(); } cout << "\nPriority Queue contents:"; while(!pq.empty()){ cout << ' ' << pq.top(); // 最大值总是位于顶部 pq.pop(); } // 显示双向链表内容 cout << "\nList content: "; for(int val:l){ cout<<val<<" "; // 输出链表里的每一个数值 } // 显示唯一集合内容 cout<<"\nSet Content: "; for(set<int>::iterator it=unique_set.begin();it!=unique_set.end();++it){ cout<<*it<<" "; // 迭代访问整个集合内的全部数值 } // 显示映射表信息(包括键和对应的值) cout<<"\nFrequency Map:\n"; for(map<int,int>::iterator mit=frequency_map.begin();mit!=frequency_map.end();++mit){ cout<<(*mit).first<<" occurs "<<(*mit).second<<" times.\n"; } return 0; } ``` 此代码片段展示了如何使用 STL 容器来存储不同类型的数据以及一些常用的算法库函数。请注意,在实际应用场景下应当根据需求选择合适的容器类型及相应的迭代策略。此外,这里使用的是一些基础的操作演示,您还可以进一步探索更多复杂的用法如自定义比较器等特性以满足特定的需求。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值