更多 STL 相关知识可看:http://c.biancheng.net/stl/
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
文章目录
- 一、vector
- 二、set
- 三、string
- 四、map
- 五、queue
- 六、piroity_queue
- 七、stack
- 八、pair
- 九、algorithm头文件
-
- 1.count() :统计给定值或字符的个数,例如字符串中统计某个字符的个数。
- 2.find() : 返回第一个值等价于给定值的元素,记住返回的是指针或游标迭代子,而不是索引。
- 3.search() : 在范围A中查找第一个与范围B等价的子范围的位置。例如查找子字符串功能。
- 4.swap() : 交换两个对象的值,可以是整形也可以是字符数组
- 5.reverse() : 反转排序指定范围中的元素。其中范围为左闭右开
- 6.sort() : 排序函数,可以是数组也可以是结构体或容器
- 7.max()/max_element()/min()/min_element()
- 8.unique() : 删除指定范围中的所有连续重复元素,仅仅留下每组等值元素中的第一个元素。
- 9.next_permutation()/prev_permutation()
- 10.fill() : 将数组或容器中的某一段区间赋为某个相同的值
- 11.lower_bound()/upper_bound()
一、vector
vector : 向量,是一个变长数组。使用vector需添加头文件< vector>
1.定义:
vector<typename> name;
如果 typename 也是一个STL容器,那么 >> 之间得加空格,不然有的编译器会认为是移位操作。如:
vector<vector<int> > name;
定义二维边长数组:
vector<typename> Arrayname[size];
这样 Arrayname[0] ~ Arrayname[size - 1] 中的每一个都是一个 vector 容器。
vector 初始化:
1)指定大小初始化,初始化后仍可用 push_back
方法增加元素:
vector<int> v(6); //容器的 size 初始化为 6
2)指定大小且初始化容器内的元素:
vector<int> v(6,3); //容器内初始化 6 个 元素 3
vector<int> v = {
1,2,3,4,5,6}; //初始化 6 个元素
3)用已存在的 vector
初始化新的 vector
容器:
vector<int> v1 = {
1,2,3};
vector<int> v2(v1);
4)二维数组的初始化:
vector<int> v(4,4);
vector<vector<int> > v2(4,v);
2.vector 容器内的元素访问
1)通过下标访问,与数组相同
2)通过迭代器访问
vector<typename>::iterator it;
这样就得到了迭代器 it ,并且可以通过 *it 来访问 vector 内的元素
如:
vector<int> vi;
vector<int>::iterator it = vi.begin(); //vi.begin()为取 vi 的首地址,而 it 指向这个地址
for(int i = 0; i < 5; i++){
printf("%d",*(it + i));
}
//vi[i] 和 *(vi.begin() + i) 是等价的
与 begin() 函数不同, end() 函数是取尾元素地址的下一个地址。此外,迭代器还实现了两种自加操作:++it 和 it++
于是还有另一种遍历方法:
for(vector<int>::iterator it = vi.begin(); it != vi.end(); it++){
printf("%d",*it);
}
在常用STL容器中,只有在 vector 和 string 中,才允许使用 vi.begin() + 3 这种迭代器加上整数的方法。
3.其他常用方法:
1 ) push_back()
push_back(x); //就是在 vector 后面添加一个元素 x 。
vi = i.push_back(x);
2 ) pop_back()
pop_back(); //就是用以删除 vector 的尾元素。
vi.pop_back();
3 ) size()
//用于获取 vector 内的元素个数
vi.size();
4 ) clear()
//用于清空 vector 中的所有元素
vi.clear();
5 ) insert()
&esmsp;insert
函数可用于插入一个数,也可用于合并两个 vector
向 vector
中插入一个数:
insert(it,x); //用来向 vector 的任意迭代器 it 处插入一个元素 x
//v1 : [1,2]
vi.insert(vi.begin() + 2, 3); //将1插入 vi[2] 的位置 --> [1,2,3]
合并 vector
:
//v1 : [1,2,3] v2 : [3,4]
v1.insert(v1.end(),v2.begin(),v2.end()); //--> [1,2,3,4,5]
6 ) erase()
erase() 有两种用法:删除单个元素、删除一个区间内的所有元素。
//删除一个元素:
vi.erase(vi.begin() + 3); // 删除vi[3]
//删除一个区间
erase(first,last);
vi.erase(vi.begin() + 1, vi.begin() + 4);
二、set
set是集合,是一个内部自动有序且不含重复元素的容器
要使用 set ,需添加 set 头文件 < set>
1.定义
set<typename> name;
set 的数组定义与 vector 相同
set<typename> Arrayname[size];
这样 Arrayname[0] ~ Arrayname[size - 1] 中的每一个都是一个set 容器。
2.set 容器内的元素访问
set 只能通过迭代器 iterator 访问
set<typename>::iterator it;
set 不支持 *(it + i) 的访问方式,因此只能按如下方式枚举
set<int> st;
for(set<int>::iterator it = st.begin(); it != st.end(); it++){
printf("%d",*it);
}
3.常用方法
1)insert()
insert(x); //可将 x 插入 set 容器中,并自动递增和去重,时间复杂度为O(logN)
st.insert(x);
2)find()
find(value); //返回 set 中对应值为 value 的迭代器,时间复杂度为O(logN)
set<int>