The STL contains sequence containers (序列容器)and associative containers(关联容器).
The standard sequence containers include vector
, deque
, and list
.
The standard associative containers are set
, multiset
, map
, multimap
, hash_set
, hash_map
, hash_multiset
and hash_multimap
.
There are also container adaptors(适配器) queue
, priority_queue
, and stack
, that are containers with specific interface, using other containers as implementation.
--Quote From https://en.wikipedia.org/wiki/Standard_Template_Library
一、pair :
Usage:
如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化;
也可以像下面一样在定义的时候直接对其初始化:
1 pair<string, string> a("1", "2");
由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:
1 typedef pair<string, string> student;
2 student stu1("1", "2");
3 student stu2("2", "3");
对于pair类,由于它只有两个元素,分别名为first和second,因此直接使用普通的点操作符即可访问其成员:
1 pair<int, string> a(1, "Poly");
2 string name;
3 name = pair.second;
可以使用make_pair对已存在的两个数据构造一个新的pair类型:
1 int a = 8;
2 string m = "James";
3 pair<int, string> newone;
4 newone = make_pair(a, m);
接受pair参数的函数:
1 void f(pair<int, const char*>);
2
3 void foo{
4 f(make_pair(42, '@'));
5 }
二、Vector
#include < vector>
向量(Vector)是一个封装了动态大小数组的顺序容器。
参考 https://blog.csdn.net/snow_me/article/details/77150998
Usage:
构造函数:
- vector(): 创建一个空vector
- vector(int nSize): 创建一个vector,元素个数为nSize
- vector(int nSize, const t& t): 创建一个vector,元素个数为nSize,且值均为t
- vector(const vector&): 复制构造函数
- vector(begin, end): 复制[begin,end)区间内另一个数组的元素到vector中
插入函数:
- void push_back(const T& x): 向量尾部插入一个元素X
- iterator insert(iterator it, const T& x): 向量中迭代器指向元素前插入一个元素x
- iterator insert(iterator it, int n, const T& x): 向量中迭代器指向元素前插入n个相同的元素x
- iterator insert(iterator it, const_iterator first, const_iterator last): 向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
删除函数:
- iterator erase(iterator it): 删除向量中迭代器指向元素
- iterator erase(iterator first, iterator last): 删除向量中[first,last)中元素
- void pop_back(): 删除向量中最后一个元素
- void clear(): 清空向量中所有元素
遍历函数:
- reference at(int pos): 返回pos位置元素的引用
- reference front(): 返回首元素的引用
- reference back(): 返回尾元素的引用
- iterator begin(): 返回向量头指针,指向第一个元素
- iterator end(): 返回向量尾指针,指向向量最后一个元素的下一个位置
- reverse_iterator rbegin(): 反向迭代器,指向最后一个元素
- reverse_iterator rend(): 反向迭代器,指向第一个元素之前的位置
元素个数:
- int size() const: 返回向量中元素的个数
- int capacity() const: 返回当前向量张红所能容纳的最大元素值
- int max_size() const: 返回最大可允许的vector元素数量值
其他函数:
- bool empty() const: 判断向量是否为空,若为空,则向量中无元素
- void swap(vector&): 交换两个同类型向量的数据
- void assign(int n,const T& x): 设置向量中第n个元素的值为x
- void assign(const_iterator first,const_iterator last): 向量中[first,last)中元素设置成当前向量元素
//模板的使用 template<typename _T> void display(_T &va) { //迭代器的使用 // _T::const_iterator iter = va.begin(); // error: need 'typename' before '_T:: const_iterator' because '_T' is a dependent scope // solution: add typename before it typename _T::const_iterator iter = va.begin(); while(iter != va.end()) { cout << (*iter) << " "; iter++; } cout << endl; } template<typename T> void reverse_display(vector<T> &va){ //反向迭代器的使用 typename vector<T>::const_reverse_iterator iter = va.rbegin(); while(iter != va.rend()) { cout << (*iter) << " "; iter++; } cout << endl; }
1 void test_vector() //#include <vector> 2 { 3 4 vector<int> a2(5); // 创建一个vector,元素个数为5 5 vector<int> a3(5, 4); //创建一个vector,元素个数为5,且值均为4 6 7 typedef vector<int> arr; 8 arr a4(a3); //复制构造函数 9 10 vector<int> a1(a3.begin(),a3.end()); // 复制构造函数 11 // error : 12 // vector<int> a1; 13 // a1(a3.begin(),a3.end()); 14 15 cout << "a1.size: " << a1.size() << endl; 16 a1.clear(); 17 cout << "cleared,a1.size: " << a1.size() << endl; 18 cout << "cleared,a1.capacity: " << a1.capacity() << endl; 19 20 cout << "a2.size: " << a2.size() << endl; 21 22 cout << "a3:"; 23 display<arr>(a3); 24 25 //test 插入数据 26 arr::const_iterator iter = a4.begin(); 27 iter++; //iter指向第二个元素 28 a4.insert(iter, 5); //第二个元素前插入5 29 //注意:insert-当vector的容量(是capacity不是size)未改变时,只失效之后的迭代器,否则全部失效 30 a4.push_back(5); //最后插入5 31 // iter+=3; //test 失效 32 // cout << (*iter) <<endl; 33 // iter+=1; 34 // cout << (*iter) <<endl; 35 arr::const_iterator iter_oth = a4.begin(); 36 iter_oth += 3; //iter指向第四个元素 37 //cout << (*iter_oth) <<endl; 38 a4.insert(iter_oth, 2, 3); // 向量中迭代器指向元素前插入2个相同的元素3 39 cout << " a4:"; 40 display<arr>(a4); 41 cout << "reverse, a4:"; 42 reverse_display<int>(a4); //逆序输出a4 43 44 //test 删除数据 45 arr::const_iterator iter_era = a4.begin(); 46 a4.erase(++iter_era); //删除第二个元素 47 //注意:vector-erase-被删除之后的迭代器全部失效 48 cout << "erased a4:"; 49 display<arr>(a4); 50 51 }
2018-09-18