C++ 刷题 使用到的一些有用的容器和函数

 优先队列

c++优先队列priority_queue(自定义比较函数)_c++优先队列自定义比较-CSDN博客

373. 查找和最小的 K 对数字 - 力扣(LeetCode)

官方题解:

class Solution {
public:
    vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
        auto cmp = [&nums1,&nums2](const pair<int,int>& a,const pair<int,int>& b) {
            return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second];
        };
        int m = nums1.size();
        int n = nums2.size();
        vector<vector<int>> ans;
        priority_queue<pair<int,int>,vector<pair<int,int>>,decltype(cmp)> pq(cmp);
        for(int i = 0;i < min(k,m);i++) {
            pq.emplace(i,0);
        }
        while(k-- > 0 && !pq.empty()) {
            auto [x,y] = pq.top();
            pq.pop();
            ans.emplace_back(initializer_list<int>{nums1[x],nums2[y]});
            if(y + 1 < n) {
                pq.emplace(x,y + 1);
            }
        }
        return ans;
    }
};

c++优先队列(priority_queue)用法详解_c++ 优先队列-CSDN博客

count函数

[C++] 基础教程 - std::count函数介绍和使用场景_std::cout-CSDN博客

std::count 是C++标准库的一个算法,用来计算给定值在指定范围内出现的次数

template <class InputIt, class T>
size_t count(InputIt first, InputIt last, const T& value);

使用场景:

#include <iostream>
#include <vector>
#include <algorithm>
 
int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5, 2, 3, 2};
    int target = 2;
 
    size_t count = std::count(nums.begin(), nums.end(), target);
    std::cout << "The number " << target << " appears " << count << " times in the array." << std::endl;
 
    return 0;
}
#include <iostream>
#include <string>
#include <algorithm>
 
int main() {
    std::string str = "hello world";
    char target = 'l';
 
    size_t count = std::count(str.begin(), str.end(), target);
    std::cout << "The character '" << target << "' appears " << count << " times in the string." << std::endl;
 
    return 0;
}

priority_queue 的自定义比较可以通过重载小于操作符或者自定义函数对象来实现。 通过重载小于操作符,可以定义一个结构体或者类,并在其中重载小于操作符来比较元素的优先级。比如,可以定义一个结构体 MyType,重载小于操作符,使得元素按照 val 从大到小排序。 ``` struct MyType { int val; bool operator<(const MyType& other) const { return val > other.val; // 从大到小排序 } }; priority_queue<MyType> pq; ``` 另一种方法是通过定义函数对象来实现自定义比较。可以创建一个结构体或类,并在其中重载()操作符,然后作为模板参数传递给 priority_queue。比如,可以定义一个类 cmp,重载了()操作符,使得小的元素在队尾,优先级越低。 ``` struct cmp { bool operator()(int a,int b){ return a < b; // 小的放左边,即less } }; priority_queue<int,vector<int>,cmp> pq; ``` 还可以使用函数指针来自定义比较。可以定义一个函数,接受两个参数,并返回一个 bool 值,表示第一个元素是否比第二个元素优先。然后将函数指针作为模板参数传递给 priority_queue。例如,可以定义一个函数对象 cmp,重载了()操作符,使得大的元素在队尾,优先级越低。 ``` bool cmp(int a, int b) { return a > b; // 大的放左边,即greater } priority_queue<int, vector<int>, bool (*)(int, int)> pq(cmp); ``` 以上是三种常见的自定义比较方法,可以根据实际需求选择其中一种来实现自定义比较。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [优先队列之自定义比较函数](https://blog.csdn.net/yrk0556/article/details/87994924)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [c++优先队列priority_queue(自定义比较函数)](https://blog.csdn.net/qq_21539375/article/details/122128445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [一文看懂priority_queue自定义比较函数有几种方法](https://blog.csdn.net/weixin_36389889/article/details/129802998)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值