C++ STL在算法题中的常用语法

multi_set

是一个有序容器,允许存储多个相同的元素,并且依然保持元素的有序性。

std::multiset<int> ms = {1, 2, 2, 3, 4, 5};

Vector

 1.将vector<int>中的元素全部置换为0

fill(vec.begin(), vec.end(), 0);

2.vector容器是可以直接用==比较是否值等的!

3.寻找vector<int>中的最小值(min_element返回的是迭代器,用*号解引用)

int min1 = *min_element(nums1.begin(), nums1.end());

Unordered_set/map

1. unordered_set的删除(count的值也会减少)

2.unordered_map中的int默认值是0,可以直接使用。

3.unordered_map的键值是否可哈希问题。

简单来说:

①合法且常见的

unordered_map<int, vector<string>>

②错,除非自定义哈希函数和相等比较函数

unordered_map<vector<string>, int>

4.枚举unordered_map中所有的元素写法:

for(auto& [k, v]: hash){
    cout << k << " " << v << endl;
}

Priority_queue

1.大根堆/小根堆的创建与记忆

priority_queue<int, vector<int>, greater<int>> heap; 

这行代码在 C++ 中声明了一个优先队列 heap,其元素类型为 int,使用 vector<int> 作为其底层容器,并且指定了 greater<int> 作为比较函数对象。

这里的关键是 greater<int> 的使用,它告诉 priority_queue 以相反于默认方式来比较元素。默认情况下,priority_queue 是一个最大堆(大根堆),即堆顶元素是最大的。但是,通过使用 greater<int>,它将变为最小堆(小根堆),即堆顶元素是最小的。

  1. 默认情况:如果你不指定第三个模板参数,默认情况下 priority_queue 是一个最大堆。这是因为默认的比较是 less<int>,它将最大的元素放在堆顶。

  2. 使用 greater:当你使用 greater<int> 作为第三个模板参数时,它改变了元素的比较方式,使得比较结果相反。因此,原本应该是最大的元素现在变成了最小的,堆变成了最小堆。

  3. 记住关键字less 通常意味着“较少”,在默认情况下它创建了一个最大堆。而 greater 意味着“更多”,使用它创建了一个最小堆

2.leetcode中若自定义比较函数为匿名函数,需要加上decltype来获取类型。

  

======API函数调用======

max使用

1.想一次性求出一系列的int或者其他类型的数字的最大值,需要先统一数据类型,再存放到临时的列表当中才行。

upper_bound和lower_bound

upper_bound使用示例(时间复杂度为O(log n))

int main() {
    std::set<int> s = {1, 3, 5, 7, 9};
    // 查找大于 4 的第一个元素
    auto it = s.upper_bound(4);
    if (it != s.end()) 
        std::cout << "The first element greater than 4 is: " << *it << std::endl;
    else 
        std::cout << "No element found that is greater than 4." << std::endl;
    return 0;
}

lower_bound使用示例

int main() {
    std::set<int> s = {1, 3, 5, 7, 9};
    // 查找第一个大于或等于 5 的元素
    auto it = s.lower_bound(5);
    
    if (it != s.end()) 
        std::cout << "The first element greater than or equal to 5 is: " << *it << std::endl;
    else 
        std::cout << "No element found that is greater than or equal to 5." << std::endl;
    return 0;
}

使用情况/前提:

        upper_bound 是 C++ 标准模板库(STL)中的一个常用函数,特别是在有序容器(如 std::setstd::map/multi_set中。upper_bound 返回一个迭代器,指向第一个大于指定值的元素。因此,upper_bound 通常用于在有序容器中查找某个范围的上界。

查找第一个小于给定值的元素 : 

        使用 lower_bound,找到第一个大于或等于给定值的元素,然后将迭代器向前移动一个位置来得到第一个小于给定值的元素

int main() {
    std::set<int> s = {1, 3, 5, 7, 9};
    int target = 6;
    // 找到第一个大于或等于 6 的元素
    auto it = s.lower_bound(target);

    // 如果它不是第一个元素,并且不等于 begin(),就向前移动迭代器
    if (it != s.begin()) {
        --it;  // 向前移动迭代器
        std::cout << "The first element less than " << target << " is: " << *it << std::endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Ocean__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值