PATの小笔记
C++标准模板库(STL)
组件 | 描述 |
---|---|
容器 | 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 queue、list、vector、map 等。 |
算法 | 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。 |
模板库 | 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。 |
1.动态数组vector
需要引用头⽂件vector
定义
//(1)直接定义长度为len的int数组
vector<int> v(len);
//(2)直接定义长度为len,初始值为n的int数组
vector<int> v(len,n);
//(3)先定义一个vector,再用resize调整长度为len
vector<int> v;
v1.resize(len);
//(4)二维都可变的二维数组
vector<vector<int> > vi;
//(5)一维可变一维定长的二维数组
vector<int> vi[100];
访问内容
//(1)与普通数组相同,直接访问下标
v[1] = 2;
//(2)使用迭代器iterator
//vector<int>::iterator可用auto代替
//begin()指向第一个元素,rbegin()指向最后一个元素,end()指向最后元素后一个元素
for (vector<int>::iterator it = c.begin(); it != c.end(); it++) {
// it是地址,需要使用*对其取值,支持*(it+i)访问
cout << *it << " ";
}
常用函数
//push_back()
//在vector后面添加一个元素, 时间复杂度为O(1)
vi.push_back(x);
//pop_back()
//用以删除vector的尾元素,时间复杂度为O(1)
vi.pop_back(x);
//int size()
//用来获取vector中元素的个数,时间复杂度为O(1)
vi.size();
//clear()
//用来清空vector中的所有元素,时间复杂度为O(N),N为vector中元素的个数
vi.clear();
//insert()
//用来向vector的任意迭代器it处插入一个元素x, 时间复杂度为O(N)
vi.insert(it, x);
//erase()
//1.删除单个元素
vi.erase(vi.begin()+3);
//2.删除一个区间内的所有元素
//erase(first, last)删除[first, last)内的所有元素
vi.erase(vi.begin() + 1, vi.begin() + 4); //删除vi[1] vi[2] vi[3]
//删除vector内所有元素可以用vi.erase(vi.begin(), vi.end())
2.集合set
set是内部从升序且不含重复元素的集合。
另有unordered_set是无序的集合。
定义
//(1)直接定义int集合
set<int> s;
//(2)定义集合数组
set<int> s[100];
访问内容
//只能使用迭代器iterator
//set<int>::iterator可用auto代替
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
// it是地址,需要使用*对其取值,不支持*(it+i)访问
cout << *it << " ";
}
常用函数
//int size()
//用来获取set中元素的个数,时间复杂度为O(1)
si.size();
//clear()
//用来清空set中的所有元素,时间复杂度为O(N),N为set中元素的个数
si.clear();
//insert(x)
//用来向set中插入元素, 时间复杂度为O(logN)
si.insert(x);
//find(x)
//返回set中对应值为x的迭代器,时间复杂度为O(logN)
si.find(x);
//erase()
//1.删除单个元素
si.erase(x); //查找x后进行删除,O(logN)
st.erase(st.find(x)); //利用find()找到x,然后用erase删除 O(1)
//2.删除一个区间内的所有元素
//erase(first, last)删除[first, last)内的所有元素
vi.erase(vi.begin(), vi.end()); //删除set内所有元素
3.映射map
map是键值对,键和值可设定为任意基本类型,内部依键的大小升序。
另有unordered_map是无序的映射。
定义
map<string,int> m; //定义一个键为string字符串,值为int的映射map
访问内容
//(1)通过键key直接访问
m["hello"] = 2; // 将key为"hello", value为2的键值对(key-value)存⼊map中
cout << m["hello"] << endl; // 访问key为"hello"的value, 如果key不存在,则返回0
//(2)使用迭代器iterator,键⽤it->first获取,值⽤it->second获取
for (auto it = m.begin(); it != m.end(); it++) {
cout << it->first << " " << it->second << endl;
}
常用函数
//find()
//find(key)返回键为key的映射的迭代器 O(logN)
map<char, int>::iterator it = mp.find('b');
printf("%c %d\n", it->first, it->second);
//erase()
//1.删除单个元素
mp.erase(it); //O(1)
mp.erase('b'); //O(logN)
//2.删除一个区间内所有元素
mp.erase(first, last); //删除[first, last)
//int size()
//用来获取map中映射的对数 O(1)
mp.size();
//clear() O(N)
mp.clear();
4.栈stack
数据结构,后进先出
定义
stack<int> s; //定义一个空栈
访问内容
s.top(); //只能访问栈顶元素
常用函数
//push()
//将x压入栈
s.push(x);
//pop()
//将栈顶元素移出栈
s.pop();
//int size()
//用来获取栈中元素个数
//bool empty()
//判断栈是否为空
5.队列queue
数据结构,先进先出
定义
queue<int> q; //定义一个队列
访问内容
//只能访问队首和队尾元素
q.front();
q.back();
常用函数
//push()
//将x压入队
q.push(x);
//pop()
//将队首元素移出队
q.pop();
//int size()
//用来获取队列中元素个数
//bool empty()
//判断队列是否为空
6.algorithm中的函数
max(), min()
最大值 最小值
swap(x,y)
交换x和y
reverse(a,b)和reverse_copy(a,b,s)
反转数组中[a,b)区间的元素,(复制到s中)
fill(a,b,n)
将数组中[a,b)区间赋值为任意值n,与memset()
不同(只能赋值0和-1)
sort(a,b,[cmp])
将数组[a,b)区间按照函数cmp(不设置则默认从小到大)的规则进行排序
只有数组,vector, string, deque可以使用sort
bool cmp(int a, int b) { // cmp函数返回的值是bool类型
return a > b; // 从⼤到⼩排列
}
int main() {
vector<int> v(10);
for (int i = 0; i < 10; i++) {
cin >> v[i];
}
sort(v.begin(), v.end(), cmp);// arr从⼤到⼩排列,因为cmp函数排序规则设置了从⼤到⼩排序
return 0;
}
lower_bound 、 upper_bound和binary_search函数
lower_bound( begin,end,num)
:从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。
返回的是最先出现的位置
upper_bound( begin,end,num)
:从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。
返回的是最后出现的位置
参数begin和end还有返回值都是地址
binary_search( begin,end,num)
:回的是是否存在这么一个数,是一个bool值。