首页 > 编程语言 >在OI类竞赛中经常使用的C++STL模板类

在OI类竞赛中经常使用的C++STL模板类

时间:2023-12-02 14:44:05浏览次数:35  
标签:返回 string OI STL 复杂度 元素 C++ 时间 pair

vector 变长数组

vector的初始化

vector<int> a; // 定义一个空的vector,且元素类型为int
vector<int> a(n); // 定义一个长度为n,元素类型为int的vector,且每个元素都是0
vector<int> a(n, x); // 定义一个长度为n,元素类型为int,且每个元素都是x的vector
vector<int> b(a); // 定义一个a的拷贝
// 也可以定义vector的数组
vector<int> c[10];

vector的常用操作

a.size(); // 返回a的元素个数 时间复杂度O(1)
a.empty(); // 判断a是否为空 时间复杂度O(1)
a.clear(); // 清空a 时间复杂度O(n)
a.push_back(x); // 在a的最后添加一个元素x 时间复杂度O(1)
a.pop_back(); // 删除a的最后一个元素 时间复杂度O(1)
a.front(); // 返回a的第一个元素 时间复杂度O(1)
a.back(); // 返回a的最后一个元素 时间复杂度O(1)

vector的遍历

// 下标遍历
for (int i = 0; i < a.size(); i++) {
    cout << a[i] << endl;
}
// 迭代器遍历
for (vector<int>::iterator it = a.begin(); it != a.end(); it++) {
    cout << *it << endl;
}
// C++11的范围for循环 由于部分比赛平台不支持C++11,所以不推荐使用
for (auto x : a) {
    cout << x << endl;
}

vector支持比较运算

两个vector的比较是从第一个元素开始,依次往后比较
如果两个vector的元素个数不同,则元素个数多的大
如果两个vector的元素个数相同,则从第一个元素开始,依次往后比较
如果两个vector的元素不同,则第一个不同的元素较大的vector大
如果两个vector的元素全部相同,则两个vector相等

vector<int> a = {1, 2, 3};
vector<int> b = {1, 2, 3};
vector<int> c = {1, 2, 4};
cout << (a < b) << endl; // 0
cout << (a < c) << endl; // 1
cout << (a == b) << endl; // 1

pair 二元组

pair的初始化

pair<int, int> a; // 定义一个空的pair,且元素类型为int和int
pair<int, int> a(1, 2); // 定义一个pair,且元素类型为int和int,且第一个元素为1,第二个元素为2
pair<int, int> a = make_pair(1, 2); // 定义一个pair,且元素类型为int和int,且第一个元素为1,第二个元素为2

pair的常用操作

a.first; // 返回a的第一个元素 时间复杂度O(1)
a.second; // 返回a的第二个元素 时间复杂度O(1)
a = make_pair(1, 2); // 将a的第一个元素赋值为1,第二个元素赋值为2 时间复杂度O(1)
pair<int, pair<int, int> > b(1, make_pair(2, 3)); // 定义一个pair,且元素类型为int和pair<int, int>,且第一个元素为1,第二个元素为pair<int, int>(2, 3)

pair支持比较运算

两个pair的比较是先比较第一个元素,如果第一个元素相同,则比较第二个元素
如果第一个元素不同,则第一个元素较大的pair大
如果第一个元素相同,则第二个元素较大的pair大
如果两个pair的元素全部相同,则两个pair相等

pair<int, int> a = {1, 2};
pair<int, int> b = {1, 2};
pair<int, int> c = {1, 3};
cout << (a < b) << endl; // 0
cout << (a < c) << endl; // 1
cout << (a == b) << endl; // 1

string 字符串

string的初始化

string a; // 定义一个空的string
string a = "abc"; // 定义一个string,且内容为abc
string a = b; // 定义一个string,且内容为b的拷贝

string的常用操作

a.size(); // 返回a的元素个数 时间复杂度O(1)
a.empty(); // 判断a是否为空 时间复杂度O(1)
a.clear(); // 清空a 时间复杂度O(n)
// a.push_back(x); // 在a的最后添加一个元素x 时间复杂度O(1)
// a.pop_back(); // 删除a的最后一个元素 时间复杂度O(1)
// a.front(); // 返回a的第一个元素 时间复杂度O(1)
// a.back(); // 返回a的最后一个元素 时间复杂度O(1)
a.substr(pos, len); // 返回a从pos开始长度为len的子串 时间复杂度O(len)
// a.find(x); // 返回a中第一个x的下标,如果不存在则返回string::npos 时间复杂度O(n)
// a.find(x, pos); // 返回a中从pos开始第一个x的下标,如果不存在则返回string::npos 时间复杂度O(n)
// a.find(s); // 返回a中第一个s的下标,如果不存在则返回string::npos 时间复杂度O(n)
// a.find(s, pos); // 返回a中从pos开始第一个s的下标,如果不存在则返回string::npos 时间复杂度O(n)
a.c_str(); // 返回a的C风格字符串 时间复杂度O(1)

string支持比较运算

两个string的比较是从第一个字符开始,依次往后比较
如果两个string的字符个数不同,则字符个数多的大
如果两个string的字符个数相同,则从第一个字符开始,依次往后比较
如果两个string的字符不同,则第一个不同的字符较大的string大
如果两个string的字符全部相同,则两个string相等

string a = "abc";
string b = "abc";
string c = "abd";
cout << (a < b) << endl; // 0
cout << (a < c) << endl; // 1
cout << (a == b) << endl; // 1

queue 队列

queue的初始化

queue<int> a; // 定义一个空的queue,且元素类型为int
queue<int> a(b); // 定义一个b的拷贝

queue的常用操作

a.size(); // 返回a的元素个数 时间复杂度O(1)
a.empty(); // 判断a是否为空 时间复杂度O(1)
a.push(x); // 在a的最后添加一个元素x 时间复杂度O(1)
a.pop(); // 删除a的第一个元素 时间复杂度O(1)
a.front(); // 返回a的第一个元素 时间复杂度O(1)
a.back(); // 返回a的最后一个元素 时间复杂度O(1)

queue的遍历

while (!a.empty()) {
    cout << a.front() << endl;
    a.pop();
}

priority_queue 优先队列

默认是大根堆

priority_queue的初始化

priority_queue<int> a; // 定义一个空的priority_queue,且元素类型为int
priority_queue<int> a(b); // 定义一个b的拷贝
priority_queue<int, vector<int>, greater<int> > a; // 定义一个空的priority_queue,且元素类型为int,且为小根堆
priority_queue<int, vector<int>, greater<int> > a(b); // 定义一个b的拷贝,且为小根堆

priority_queue的常用操作

a.size(); // 返回a的元素个数 时间复杂度O(1)
a.empty(); // 判断a是否为空 时间复杂度O(1)
a.push(x); // 在a的最后添加一个元素x 时间复杂度O(logn)
a.pop(); // 删除a的第一个元素 时间复杂度O(logn)
a.top(); // 返回a的第一个元素 时间复杂度O(1)

priority_queue的遍历

while (!a.empty()) {
    cout << a.top() << endl;
    a.pop();
}

priority_queue的自定义比较函数

struct cmp {
    bool operator() (int a, int b) {
        return a > b;
    }
};
priority_queue<int, vector<int>, cmp> a;

stack 栈

stack的初始化

stack<int> a; // 定义一个空的stack,且元素类型为int
stack<int> a(b); // 定义一个b的拷贝

stack的常用操作

a.size(); // 返回a的元素个数 时间复杂度O(1)
a.empty(); // 判断a是否为空 时间复杂度O(1)
a.push(x); // 在a的最后添加一个元素x 时间复杂度O(1)
a.pop(); // 删除a的第一个元素 时间复杂度O(1)
a.top(); // 返回a的第一个元素 时间复杂度O(1)

stack的遍历

while (!a.empty()) {
    cout << a.top() << endl;
    a.pop();
}

deque 双端队列

deque的初始化

deque<int> a; // 定义一个空的deque,且元素类型为int
deque<int> a(n); // 定义一个长度为n,元素类型为int的deque,且每个元素都是0
deque<int> a(n, x); // 定义一个长度为n,元素类型为int,且每个元素都是x的deque
deque<int> a(b); // 定义一个b的拷贝

deque的常用操作

a.size(); // 返回a的元素个数 时间复杂度O(1)
a.empty(); // 判断a是否为空 时间复杂度O(1)
a.clear(); // 清空a 时间复杂度O(n)
a.push_back(x); // 在a的最后添加一个元素x 时间复杂度O(1)
a.pop_back(); // 删除a的最后一个元素 时间复杂度O(1)
a.push_front(x); // 在a的最前面添加一个元素x 时间复杂度O(1)
a.pop_front(); // 删除a的最前面一个元素 时间复杂度O(1)
a.front(); // 返回a的第一个元素 时间复杂度O(1)
a.back(); // 返回a的最后一个元素 时间复杂度O(1)

deque的遍历

// 下标遍历
for (int i = 0; i < a.size(); i++) {
    cout << a[i] << endl;
}
// 迭代器遍历
for (deque<int>::iterator it = a.begin(); it != a.end(); it++) {
    cout << *it << endl;
}
// C++11的范围for循环 由于部分比赛平台不支持C++11,所以不推荐使用
for (auto x : a) {
    cout << x << endl;
}

由于deque的速度比较慢,所以在比赛中一般不使用deque

set, multiset

基于平衡二叉树(红黑树),动态维护有序序列

set初始化

set<int> a; // 定义一个空的set,且元素类型为int
set<int> a(b); // 定义一个b的拷贝

set的常用操作

a.size(); // 返回a的元素个数 时间复杂度O(1)
a.empty(); // 判断a是否为空 时间复杂度O(1)
a.clear(); // 清空a 时间复杂度O(n)
a.insert(x); // 在a中插入一个元素x 时间复杂度O(logn)
a.erase(x); // 删除a中值为x的元素 时间复杂度O(logn)
a.erase(it); // 删除a中迭代器为it的元素 时间复杂度O(logn)
a.find(x); // 返回a中值为x的元素的迭代器,如果不存在则返回a.end() 时间复杂度O(logn)
a.count(x); // 返回a中值为x的元素的个数 时间复杂度O(logn)
a.lower_bound(x); // 返回a中第一个大于等于x的元素的迭代器,如果不存在则返回a.end() 时间复杂度O(logn)
a.upper_bound(x); // 返回a中第一个大于x的元素的迭代器,如果不存在则返回a.end() 时间复杂度O(logn)
a.front(); // 返回a的第一个元素 时间复杂度O(1)
a.back(); // 返回a的最后一个元素 时间复杂度O(1)
a.begin(); // 返回a的第一个元素的迭代器 时间复杂度O(1)
a.end(); // 返回a的最后一个元素的迭代器 时间复杂度O(1)

multi_set的操作和set的操作完全一样, 只是multi_set允许有重复元素

map, multimap

基于平衡二叉树(红黑树),动态维护有序序列

map初始化

map<int, int> a; // 定义一个空的map,且元素类型为int和int
map<int, int> a(b); // 定义一个b的拷贝

map的常用操作

a.size(); // 返回a的元素个数 时间复杂度O(1)
a.empty(); // 判断a是否为空 时间复杂度O(1)
a.clear(); // 清空a 时间复杂度O(n)
a.insert(make_pair(x, y)); // 在a中插入一个元素x,且值为y 时间复杂度O(logn)
a.erase(x); // 删除a中键为x的元素 时间复杂度O(logn)
a.erase(it); // 删除a中迭代器为it的元素 时间复杂度O(logn)
a.find(x); // 返回a中键为x的元素的迭代器,如果不存在则返回a.end() 时间复杂度O(logn)
a.count(x); // 返回a中键为x的元素的个数 时间复杂度O(logn)
a.lower_bound(x); // 返回a中第一个大于等于x的元素的迭代器,如果不存在则返回a.end() 时间复杂度O(logn)
a.upper_bound(x); // 返回a中第一个大于x的元素的迭代器,如果不存在则返回a.end() 时间复杂度O(logn)
a.front(); // 返回a的第一个元素 时间复杂度O(1)
a.back(); // 返回a的最后一个元素 时间复杂度O(1)
a.begin(); // 返回a的第一个元素的迭代器 时间复杂度O(1)
a.end(); // 返回a的最后一个元素的迭代器 时间复杂度O(1)
a[x]; // 返回a中键为x的元素的值,如果不存在则插入一个键为x的元素,且值为0 时间复杂度O(logn)
a.at(x); // 返回a中键为x的元素的值,如果不存在则抛出异常 时间复杂度O(logn)

multi_map的操作和map的操作完全一样, 只是multi_map允许有重复元素

unordered_set, unordered_map, unordered_multiset, unordered_multimap 哈希表

不支持自定义比较函数,但是不支持lower_bound, upper_bound, 因为哈希表是无序的
其他操作和set, map, multi_set, multi_map完全一样,只是底层实现不同,哈希表的时间复杂度为O(1)

bitset 压位

bitset的初始化

bitset<100> a; // 定义一个长度为100的bitset
bitset<100> a(string("1111111111")); // 定义一个长度为100的bitset,且值为1111111111
bitset<100> a(0x7fffffff); // 定义一个长度为100的bitset,且值为0x7fffffff
bitset<100> a(a); // 定义一个a的拷贝

bitset的常用操作

a.count(); // 返回a中1的个数 时间复杂度O(n)
a.size(); // 返回a的长度 时间复杂度O(1)
a.any(); // 判断a中是否有1 时间复杂度O(n)
a.none(); // 判断a中是否没有1 时间复杂度O(n)
a.set(); // 将a中所有位都变成1 时间复杂度O(n)
a.set(pos); // 将a中下标为pos的位变成1 时间复杂度O(1)
a.reset(); // 将a中所有位都变成0 时间复杂度O(n)
a.reset(pos); // 将a中下标为pos的位变成0 时间复杂度O(1)
a.flip(); // 将a中所有位取反 时间复杂度O(n)
a.flip(pos); // 将a中下标为pos的位取反 时间复杂度O(1)
a[pos]; // 返回a中下标为pos的位的值 时间复杂度O(1)

标签:返回,string,OI,STL,复杂度,元素,C++,时间,pair
From: https://www.cnblogs.com/BryceAi/p/17871586.html

相关文章

  • 【C++ Primer Plus】C++11 深入理解右值、右值引用和完美转发
    1.右值引用和移动语义1.1左值和右值左值localvalue:存储在内存中、有明确存储地址(可寻址)的数据(x、y、z)右值 readvalue:不一定可以寻址,例如存储于寄存器中的数据;通常字面量都是右值,除了字符串常量(1、3)intx=1;inty=3;intz=x+y; 对于x++和++x虽然都是自......
  • C++多线程编程:利用线程提高程序并发性
    C++多线程编程:利用线程提高程序并发性引言在现代计算机系统中,程序的并发性已经变得越来越重要。多线程编程是一种利用计算机的多核处理器来提高程序性能的方法。C++是一种功能强大的编程语言,提供了丰富的多线程编程支持。本文将介绍如何利用C++多线程编程来提高程序的并发性。什么......
  • P1017 [NOIP2000 提高组] 进制转换
    P1017[NOIP2000提高组]进制转换负进制也一样用短除法转换,但是余数得保证是正数,不然没法用这个方法。在求余的过程中加入处理:如果负数,余数减去一个模数,上一次的商先加上一个模数再去除模数得到本次商。比如对于\(10\)到\(-2\)进制的转换。第一次短除\(-2\),余\(0\)......
  • 【Android逆向】一些零碎的笔记
    *在/sdcard/下的文件无法执行,必须将其拷贝到其它位置执行,如/data/目录,/data/目录中是system分组,可以执行程序;*每个应用都会创建一个对应的应用用户,如:cn.abcpiano.pianist包名的应用,创建了一个u0_a147用户;* getpropro.product.cpu.abi ......
  • noip 2023 游记
    Day-1今天……不知道干了什么感觉心里有点没底但是最近几天改题效率都一般,不晓得是哪里出了问题看\(K8\)博客才意识到他们考完之后就要走了啊那么好多人也都要走了本来这三天连着模拟赛都不错,结果刚刚仔细一想……是不是都是简单题啊,是不是我难题连暴力分都没拿到啊……......
  • C++入门:掌握基本语法和面向对象编程
    C++入门:掌握基本语法和面向对象编程C++是一种通用的、高级的编程语言,广泛应用于开发各种应用程序。对于初学者来说,掌握C++的基本语法和面向对象编程是一个重要的起点。本篇博客将介绍C++的基本语法和面向对象编程的基本概念。了解C++的基本语法注释在C++中,你可以使用两种方式添加注......
  • C++聊天集群服务器5
    一、服务器异常处理函数​ 这部分主要处理服务器异常退出时,用户的在线状态还是online不会改变,因此需要修改。由于是需要对用户进行操作,因此我们在user表的数据操作类添加重置用户状态函数。​ 在usermodel.hpp添加后:#ifndefUSERMODEL_#defineUSERMODEL_#include"user.hpp......
  • P4770 [NOI2018] 你的名字 做题记录
    我永远喜欢数据结构题目传送门给出字符串\(s\)以及\(q\)个询问,第\(i\)个询问给出一个串\(t_i\)以及一个区间\([l_i,r_i]\)。记\(s[l,r]\)为字符串\(s\)第\(l\)位到第\(r\)位字符顺次拼接而成的子串。形式化地,\(s[l,r]=\overline{s_ls_{l+1}\dotss_r}\)......
  • C++学习笔记——函数探幽
    C++内联函数内联函数是一种用空间换时间的技术,是C++提高程序运行速度做的改进。运行程序时操作系统将指令载入计算机内存中,并逐条执行这些指令,遇到循环或分支时向前或向后跳转到特定的地址(每条指令都有特定的内存地址)。常规函数也是如此,在调用常规函数时立即存储该指令的地址......
  • error: Microsoft Visual C++ 14.0 or greater is required
    1、错误背景python在安装aiohttp库时,出现MicrosoftVisualC++14.0orgreaterisrequired的提示:2、解决方案按照错误提示,访问https://visualstudio.microsoft.com/visual-cpp-build-tools/,下载生成工具:执行下载的exe执行文件:选择使用C++桌面开发,选......