一.c++的std中的自定义类型使用(sort、map的key、priority_queue)

1.自定义sort

c++11后的lambda表达式很好用

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {5, 2, 9, 1, 5, 6};

    // 使用Lambda表达式进行排序 (降序排序)
    std::sort(vec.begin(), vec.end(), [](int a, int b) {
        return a > b;
    });

    // 输出排序后的结果
    for(int num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

2.自定义unordered_map的key

如果是map和set因为是红黑树所以不需要哈希函数只要key直接能比较大小就可以直接当key用(比如vector<int>本身就实现了比大小),如果是unordered_map或unordered_set则需要自己设计哈希函数,一般来说题目遇到vector<int>,pair<int,int>就用map先试试看

#include <iostream>
#include <unordered_map>
#include <utility> // std::pair
#include <functional> // std::hash

// 自定义哈希函数
struct pair_hash {
    template <class T1, class T2>
    std::size_t operator () (const std::pair<T1, T2>& p) const {
        auto hash1 = std::hash<T1>{}(p.first);
        auto hash2 = std::hash<T2>{}(p.second);
        // 结合两个哈希值,避免冲突
        return hash1 ^ (hash2 << 1);
    }
};

int main() {
    // 使用std::pair<int, int>作为键的unordered_map
    std::unordered_map<std::pair<int, int>, std::string, pair_hash> map;
    // 插入一些值
    map[{1, 2}] = "One-Two";
    map[{3, 4}] = "Three-Four";
    map[{5, 6}] = "Five-Six";
    // 查找并输出
    std::pair<int, int> key = {1, 2};
    if (map.find(key) != map.end()) {
        std::cout << "Key (1, 2) has value: " << map[key] << std::endl;
    } else {
        std::cout << "Key (1, 2) not found." << std::endl;
    }

    return 0;
}

3.自定义比较priority_queue

这里要注意lambda表达式前要加上decltype关键词,实际上是decltype(auto)这个用法,注意pq初始化时要传入参数


复制代码
#include <iostream>
#include <queue>
#include <vector>

// 使用decltype(auto)实现自定义比较函数
auto customCompare = [](const int& a, const int& b) -> decltype(auto) {
    return a > b; // 定义为小顶堆(最小元素在顶部)
};

int main() {
    // 使用decltype(auto)的比较函数自定义priority_queue
    std::priority_queue<int, std::vector<int>, decltype(customCompare)> pq(customCompare);

    // 插入元素
    pq.push(5);
    pq.push(2);
    pq.push(8);
    pq.push(3);

    // 输出元素
    while (!pq.empty()) {
        std::cout << pq.top() << " "; // 输出顺序应该为:2 3 5 8
        pq.pop();
    }

    return 0;
}