C++ 的 STL 常用标准模板库
以下内容只是记录C++中常用标准库的大致用法,更多方法或者具体参数请参考C++的API文档,具体运用还需根据实际情况书写代码
- 头文件
- 类似于第三方包,或者说是系统的包
- # include<bits/stdc++.h> ,包含所有头文件
// 向量容器 # include<vector> // 字符串类型 # include<string> // 算法库 # include<algorithm> // 栈 # include<stack> // 队列 # include<queue> // 集合 # include<set> // 映射 # include<map>
// 链表
# include<list>
- 向量 vector
- 类似与数组或者链表,存储空间 “无限”
// vector
void vec_function() {
// vector<int> acc(100) 生成指定容量的容器
vector<int> vec;
for(int i=1; i<=20; i++) {
// 添加数据方式
vec.push_back(21-i);
}
// 插入字符串,insert(位置下标,字符串)
vec.insert(vec.begin(), 0);
// 通过迭代器遍历,包括vector,queue,stack等同理
// 迭代器跟指针的作用类似
vector<int>::iterator ite_vec;
for(ite_vec=vec.begin(); ite_vec!=vec.end(); ite_vec++) {
cout<< *ite_vec<< " ";
}
// vector 也可以使用类似数组一样遍历
int length = vec.size();
for(int i=0; i<length; i++) {
cout<< vec[i]<< " ";
}
// 清空容器内容
vec.clear();
}
- 字符串 string
- 字符串类型,便于字符串操作
// string
void str_function() {
string str = "abc";
// 末尾添加一个字符
str.push_back('2');
// 末尾拼接一个字符串 str += "345" 同效果,但这种是生成了新的变量
str.append("345");
// 在指定位置插入数据
str.insert(3, "1");
cout<< str;
}
- 算法库 algorithm
- 提供常用的算法支持,这里值用了sort、nth_element
// sort、nth_element
void algorithm_function() {
int arr[] = {3, 1, 5, 2, 4, 10, 7, 9, 8, 6};
// 快速排序,平均时间复杂读 O(n*logn)
// sort([a, b), Compare_function)
sort(arr+0, arr+10, com);
for(int i=0; i<10; i++) {
cout<< arr[i]<< " ";
}
// 模拟快速排序,平均时间复杂度 O(n)
// 即得出下标为 n 位置的元素有序,其余不一定
// nth_element(X.begin(), X.begin()+n, X.end())
nth_element(arr, arr+3, arr+10);
for(int i=0; i<10; i++) {
cout<< arr[i]<< " ";
}
}
algorithm
- 栈 stack
- 先进后出
// stack
void st_function() {
stack<int> st;
// 进栈,从末尾进
st.push(5);
// 取栈顶元素
int ele = st.top();
cout<< ele;
// 退栈,从末尾退
st.pop();
// 栈是否为空
st.empty();
// 栈内元素数量
st.size();
}
- 队列 queue
- 如同排队,先进先出
// queue
void que_function() {
queue<int> que;
// 进队列,从队尾进
for(int i=0; i<5; i++) {
que.push(i);
}
// 取队列队首元素
int ele = que.front();
cout<< ele;
// 出队列,从队首出
que.pop();
// 队列是否为空
que.empty();
// 队内元素数量
que.size();
}
- 优先队列 priority_queue
- 自动排好序的队列
// priority_queue
void pri_que_function() {
// greater 升序(默认), less 降序
priority_queue<int, vector<int>, less<int> > pri_que;
int num[10] = {5, 2, 3, 7, 9, 4, 10, 6, 1, 8};
for(int i=0; i<10; i++)
pri_que.push(num[i]);
while(!pri_que.empty()){
cout<< pri_que.top()<< " ";
pri_que.pop();
}
}
- 二元组 pair
- 二元数据对
// pair
void pair_function() {
// pair 初始赋值
pair<int, string> p1, p2(1, "Tom");
// 通过 make_pair 赋值
p1 = make_pair(1, "Jerry");
// 直接对比需要两个分量都相等才能相等
cout<< bool(p2==p1)<< endl;
// pair 先比较第一个元素,再比较第二个元素
cout<< bool(p2 > p1)<< endl;
// 二元组是数据结构,也可抽象出数组
pair<string, int> p[10];
for(int i=0; i<9; i++) {
// 可以分别赋值
p[i].second = i+175;
p[i].first = "Tom";
}
// 也可以使用 make_pair() 赋值
p[9] = make_pair("Tom", 185);
for(int i=0; i<10; i++) {
cout<< p[i].first<< " "<< p[i].second<< endl;
}
}
- 映射 map
- 映射关系
// map
void map_function() {
// 创建 map 映射
map<string, int> m;
// 创建索引并添加
m["tom"] = 185;
m["silly"] = 175;
// map 可以使用 insert 添加 pair
pair<string, int> p("Jerry", 180);
m.insert(p);
// 清除索引为 Jerry 的元素
m.erase("Jerry");
map<string, int>::iterator it;
// 读取内容
for(it = m.begin(); it != m.end(); it++) {
// it:指针
// 取出map的第一项和第二项,也就是key-value
cout<< it->first<< " "<< it->second<< endl;
}
}
- 集合 set
// set
void set_function() {
set<int> s;
// 插入元素
int num[] = {1, 3, 2, 3, 2};
for(int i=0; i<5; i++) {
s.insert(num[i]);
}
// 删除指定内容元素
s.erase(2);
// 要用迭代器读取, 默认是从小到大
set<int>::iterator ss;
for(ss = s.begin(); ss != s.end(); ss++)
cout<< *ss<< ' ';
cout<< endl;
// 集合查找元素
ss = s.find(6);
// 找到元素
if(ss != s.end()) {
cout<< *ss<< endl;
//若指针已经到末尾了,则说明找不到该元素
}else {
cout<< "Not find!\n";
}
}
- 堆 heap
// make_heap(n.begin(), n.end(), com); // 可使用com比较函数如sort一样,默认大根堆 // 堆 void heap_function() { // 使用vector向量 vector<int> n; // 0 1 2 3 4 for(int i = 0; i <= 4; i++) { n.push_back(i); } // 注 push_heap是在堆已经建立的基础上添加元素 // 而 make_heap是先把元素添加到数组,再用数组重新建堆 // 通过数组建堆 make_heap(n.begin(), n.end()); // 打印数组元素 // 4 3 2 0 1 show(n); // 排序,会打乱堆结构 // sort_heap(n.begin(), n.end()); // show(); n.push_back(5); // 添加堆元素 push_heap(n.begin(), n.end()); // 5 3 4 0 1 2 show(n); // 堆顶元素弹出,如大根堆弹出最大值 pop_heap(n.begin(), n.end()); // 4 3 2 0 1 show(n); }
- 链表list
// 双向链表 list void list_function() { list<int> l; for(int i = 1; i <= 5; i++) { l.push_back(i); } // 链表表头插入元素 l.push_front(99); // 链表表头删元素 l.pop_front(); // 链表表尾删元素 l.pop_back(); // 删除链表的指定项 l.remove(4); // 迭代器 list<int>::iterator it; // 读取链表元素 for(it = l.begin(); it != l.end(); it++) { cout<< *it<< " "; } // 清空链表元素 l.clear(); }