1.对于map/unorderedmap这种,比如想要按照second去排序,思路一,转换成vector这种线性容器,然后利用sort函数,自定义第三个参数去做想要的排序
总之就得转换成别的去做,不能在初始化的时候用自定义的函数或者lambda啥的去做手脚,去按值去排序,,注意是按值不行也就是second。但是对于键来说是可以的,按照如下套用方式
就是只能对键做操作:,你要是换成pair然后改成什么second比较一定是错的
bool cmp(int a,int b)
{
return a>b;
}
// 定义一个自定义比较函数并传递给 map 的构造函数
map<int, int, decltype(&cmp)> treeMap(cmp);
map<int, int, decltype(cmp)*> treeMap(cmp);
class Solution {
public:
bool operator()(int a,int b)const
{
return a>b;
}
};
map<int, int, Solution> treeMap;
map<int, int, Solution> treeMap1;
完了用auto,lambda,functional都可以,,具体看下面的用优先级队列演示的!
记住map这种不能在构造时对值动手脚,要动只能后面转换成别的容器,然后在套用自定义的函数
2.对于想在初始化的时候做手脚,是我重点演示的:嗯..这里的话优先级队列存pair啥的可以对值去更改,对于map这种em不就行了,只能去改键的规则
std::map
和std::unordered_map
这两种数据结构的设计原则和底层实现决定了它们不能在构建时直接按值更改排序方式。
std::map
是基于平衡二叉搜索树实现的关联容器,其中的元素会根据键自动排序。在std::map
中,每个节点都包含一个键值对,左子树中的所有节点的键小于父节点的键,右子树中的所有节点的键大于父节点的键。这样的设计使得std::map
可以在对数时间内完成插入、删除和查找操作。由于std::map
的底层实现依赖于键的顺序,因此不能直接在构建时按值排序。
std::unordered_map
是基于哈希表实现的关联容器,它不对元素进行排序。在std::unordered_map
中,元素的位置由键的哈希值决定,元素被分配到不同的桶中。这样的设计使得std::unordered_map
在平均情况下可以在常数时间内完成插入、删除和查找操作。由于std::unordered_map
的底层实现与元素的顺序无关,因此也不能直接在构建时按值排序。然而,对于
std::priority_queue
,您可以在构建时指定自定义的比较函数,以便根据std::pair
中的值进行排序。std::priority_queue
是基于堆实现的,它允许在构建时指定一个比较函数
下面看几种写法:我拿23题做例子,你里面存pair啥都行一个道理
1.
class Solution {
public:
bool operator()(ListNode *a,ListNode*b)const
{
return a->val>b->val;
}
};
priority_queue<ListNode*,vector<ListNode*>,Solution> que;
2.
static bool cmp(ListNode *a,ListNode*b)
//全局函数就行,只不过我在题的类里写的 所以加了static
{
return a->val>b->val;
}
priority_queue<ListNode*,vector<ListNode*>,decltype(&cmp)> que(cmp);
priority_queue<ListNode*,vector<ListNode*>,decltype(cmp)*> que(cmp);
3.
auto cmp1=[](ListNode *a,ListNode*b)
{
return a->val>b->val;
};
priority_queue<ListNode*,vector<ListNode*>,decltype(cmp1)> que(cmp1);
4.
static bool cmp(ListNode *a,ListNode*b)
{
return a->val>b->val;
}
function<bool(ListNode *a,ListNode*b)>fun(cmp);
priority_queue<ListNode*,vector<ListNode*>,decltype(fun)> que(fun);
5.
auto cmp1=[](ListNode *a,ListNode*b)
{
return a->val>b->val;
};
function<bool(ListNode *a,ListNode*b)>fun(cmp1);
priority_queue<ListNode*,vector<ListNode*>,decltype(fun)> que(fun);