约 321 字 预计阅读 2 分钟
c++ STL
学习c++就没法绕过标准模版库STL。
STL6大部件
- 容器(Containers)
- 分配器(Allocators)
- 算法(Algorithm)
- 迭代器(Iterators)
- 适配器(Adapters)
- 仿函数(Functors)
STL的基本使用
vector
vector是一种变长数组
- 类型名可以是int、double、char、string、struct,也可以是vector、set、queue等容器。
1
2
3
4
5
6
|
vector<int> name;
vector<double> name;
vector<char> name;
vector<string> name;
vector<struct node> name;
vector<vector<int> > name;
|
vector<vector<int> > name;
中>>
之间要有空格
才行。
定义一个二维变长数组
1
|
vector<int> arr[10]; // 二维变长数组。
|
- 注意:低维是高维的地址。
- 二维数组的一维形式就是地址。
vector一般有2种访问形式
1
2
3
4
5
6
7
8
9
|
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector v;
v.push_back(1);
cout << v[0] << endl;
return 0;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
void testVectorIterator() {
vector<int> v;
for (int i=0;i<5;++i) {
v.push_back(i+10);
}
vector<int>::iterator it = v.begin();
// it[i] 等价于*(it + i)
for (int i=0;i<v.size();++i) {
cout << "vector::it-" << i << ":" << it[i] << endl;
}
// 优雅写法
for (vector<int>::iterator it2 = v.begin(); it2 != v.end();it2++) {
cout << *it2 << " ";
}
cout << endl << "c++11:";
for (auto it2 = v.begin(); it2 != v.end();it2++) {
cout << *it2 << " ";
}
}
|
vector常用函数
push_back()
- 以前还要为定长数组内存分配而苦恼时,现在只需要无脑push_back()
pop_back()
size()
clear()
- 一键清空vector中的所有元素时间复杂度为O(N),其中N为vector中元素个数。
insert()
1
|
v.insert(v.begin()+2,-1); //将-1插入v[2]的位置
|
erase()
1
2
3
4
5
|
//删除v[3]
v.erase(v.begin()+3);
//删除v[1]-v[4]
v.erase(v.begin()+1,v.begin()+4);
|
vector常见用途
存储数据
用邻接表存储图
set
定义
1
2
|
#include<set>
using namespace std;
|
set容器内元素的访问
1
2
|
set<int>::iterator it;
set<char>::iterator it;
|
- 注意:除了vector和string之外的STL容器都不支持*(it+i)的访问方式
set常用函数
insert(value)
1
2
3
4
|
set<char> st;
st.insert('A');
st.insert('B');
st.insert('C');
|
find(value)
- find(value)返回的是set中value对应的迭代器,也就是value的指针(地址)。
1
2
3
4
5
6
|
set<char> st;
st.insert('A');
st.insert('B');
st.insert('C');
set<char>::iterator it = st.find('B');
cout << *it << endl;
|
erase(it)
1
2
3
4
5
6
7
|
set<char> st;
st.insert('A');
st.insert('B');
st.insert('C');
set<char>::iterator it = st.find('B');
cout << *it << endl;
st.erase(it);
|
erase(beginIt,endIt)
1
2
3
4
5
6
7
|
set<char> st;
st.insert('A');
st.insert('B');
st.insert('C');
set<char>::iterator it = st.find('B');
cout << *it << endl;
st.erase(it,st.end());
|
size()
string
map
queue
priority_queue
stack
pair
algrithm
参考