Harris
发布于 2026-05-06 / 5 阅读
0
0

摘录

经典的枚举子集的技巧:for (int S0 = S; S0 > 0; S0 = (S0 - 1) & S)。这个循环能无重复、无遗漏地遍历出集合 S 的所有非空子集。

priority_queue 不提供迭代器,也不支持随机访问

  • empty(): 检查队列是否为空。
  • size(): 返回队列中的元素数量。
  • top(): 返回队列顶部的元素(不删除它)。
  • push(): 向队列添加一个元素。
  • pop(): 移除队列顶部的元素。

C++ 容器类 <set> `#include

C++ 标准库中的 <set> 是一个关联容器,它存储了一组唯一的元素,并按照一定的顺序进行排序。

<set> 提供了高效的元素查找、插入和删除操作。它是基于红黑树实现的,因此具有对数时间复杂度的查找、插入和删除性能。

<set> 容器中存储的元素类型必须满足以下条件:

  • 元素类型必须可以比较大小。
  • 元素类型必须可以被复制和赋值。

std::set< 元素类型 > 容器名;

常用操作

  • insert(元素): 插入一个元素。
  • erase(元素): 删除一个元素。
  • find(元素): 查找一个元素。
  • size(): 返回容器中元素的数量。
  • empty(): 检查容器是否为空。
#include <algorithm>

STL中sort的使用方法

C++ STL 标准库中的 sort() 函数,本质就是一个模板函数。该函数专门用来对容器或普通数组中指定范围内的元素进行排序,排序规则默认以元素值的大小做升序排序,除此之外我们也可以选择标准库提供的其它排序规则(比如 std::greater 降序排序规则),甚至还可以自定义排序规则。

值得一提的是,sort() 函数位于头文件中,因此在使用该函数前,程序中应包含如下语句:

#include <algorithm>

sort() 函数有 2 种用法,其语法格式分别为:

//对 [first, last) 区域内的元素做默认的升序排序
void sort (RandomAccessIterator first, RandomAccessIterator last);
//按照指定的 comp 排序规则,对 [first, last) 区域内的元素进行排序
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

其中,first 和 last 都为随机访问迭代器,它们的组合 [first, last) 用来指定要排序的目标区域;另外在第 2 种格式中,comp 可以是 C++ STL 标准库提供的排序规则(比如 std::greater),也可以是自定义的排序规则。

数组排序样例:

#include <algorithm>
#include <algorithm>

using namespace std;

int main(){
    int arr[] = {2,6,3,5,4,8,1,0,9,10};
    sort(arr, arr+10);
    for(int i = 0;i < 10;i++)
        cout << arr[i] << " ";
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/

使用 STL 标准库提供的排序规则

int main(){
    int arr[] = {2,6,3,5,4,8,1,0,9,10};
    sort(arr, arr+10, std::greater<int>());
    for(int i = 0;i < 10;i++)
        cout << arr[i] << " ";
    cout << endl;
    sort(arr, arr+10, std::less<int>());
    for(int i = 0;i < 10;i++)
        cout << arr[i] << " ";
}
// out
/*
10 9 8 6 5 4 3 2 1 0
0 1 2 3 4 5 6 8 9 10
*/

使用自定义比较器

bool cmp(const int a, const int b){
    return a < b;
}
int main(){
    int arr[] = {2,6,3,5,4,8,1,0,9,10};
    sort(arr, arr+10, cmp);
    for(int i = 0;i < 10;i++)
        cout << arr[i] << " ";
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/

使用 lambda 表达式自定义比较器

int main(){
    int arr[] = {2,6,3,5,4,8,1,0,9,10};
    sort(arr, arr+10, [](const int a, const int b){
         return a < b;
         });
    for(int i = 0;i < 10;i++)
        cout << arr[i] << " ";
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/

使用sort对vector的排序

在 C++ 中几乎操作 vector 时,几乎可以视作是在操作数组,可以将 vector 看作对数组的封装。因此,使用 sort 对 vector 进行排序时完全可以遵循上面使用 sort 对数组的排序方法。

一维 vector 排序

int main(){
    vector<int> vec = {2,6,3,5,4,8,1,0,9,10};
    sort(vec.begin(), vec.end());
    for(int item: vec)
        cout << item << " ";
    return 0;
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/

二维 vector 排序。数组保存一系列的坐标,先按照第二维进行升序排列,再按照第一维升序排列

int main(){
    vector<vector<int>> vvi = {{9,1}, {2,3}, {8,7}, {6,2}, {5,2}};

    sort(vvi.begin(), vvi.end(), [](const vector<int>& v1, const vector<int>& v2){
         if(v1[1] < v2[1]) return true;
         else if(v1[1] == v2[1]) return v1[0] < v2[0];
         else return false;
         });

    for(vector<int> v: vvi){
        for(int item: v){
            cout << item << " ";
        }
        cout << endl;
    }

    return 0;
}
// out
/*
9 1
5 2
6 2
2 3
8 7
*/

使用sort对map排序

map 是用来存放 <key, value> 键值对的数据结构,可以很方便快速的根据 key 查到相应的 value,map 本身的实现方式内含了比较器的设置,只要我们在 map 初始化的时候传入比较器,即可完成对应的排序。

定义包含水果及其个数的 map,按照水果名称字典序进行排序 (按 key 排序)

#include<map>

using namespace std;

int main(){
    map<string, int, less<string>> msi;
    msi["apple"] = 5;
    msi["watermelon"] = 2;
    msi["pear"] = 3;
    msi["peach"] = 6;
    msi["cherry"] = 10;

    for(auto item: msi)
        cout << item.first << " " << item.second << endl;

    return 0;
}
// out
/*
apple 5
cherry 10
peach 6
pear 3
watermelon 2
*/

定义包含水果及其个数的 map,按照水果个数进行排序,当水果个数相同时,按照水果名称字典序排序 (将 map 转为 vector 进行排序)

bool cmp(const pair<string, int>& a, const pair<string, int>& b){
    if(a.second < b.second) return true;
    else if(a.second == b.second) return a.first < b.first;
    else return false;
}
int main(){
    map<string, int> msi;
    msi["apple"] = 5;
    msi["watermelon"] = 2;
    msi["pear"] = 3;
    msi["peach"] = 5;
    msi["cherry"] = 10;

    vector<pair<string, int>> vpi(msi.begin(), msi.end());
    sort(vpi.begin(), vpi.end(), cmp);

    for(auto item: vpi){
        cout << item.first << " " << item.second << endl;
    }

    return 0;
}
// out
/*
watermelon 2
pear 3
apple 5
peach 5
cherry 10
*/

使用sort对list排序

sort()函数模板定义在头文件 algorithm 中,要求使用随机访问迭代器。但 list 容器并不提供随机访问迭代器,只提供双向迭代器,因此不能对 list 中的元素使用 sort() 算法。但是,还是可以进行元素排序,因为 list 模板定义了自己的 sort()函数。sort() 有两个版本:无参 sort()函数将所有元素升序排列。第二个版本的 sort() 接受一个函数对象或 lambda 表达式作为参数,这两种参数都定义一个断言用来比较两个元素。

list 排序示例

int main(){
    list<string> ls = {"one", "two", "three"};
    ls.sort([](const string& a, const string& b){
                return a < b;
            });
    for(string item: ls) cout << item << " ";

    return 0;
}
// out
/*
one three two
*/

unique

unique_ 函数是 STL(标准模板库)中的一个实用函数,用于去除容器或数组中相邻的重复元素,并保持顺序。它的返回值是一个迭代器,指向去重后容器的尾部,即第一个重复元素的位置。


评论