Standard Templete Library —— Containers

The STL contains sequence containers (序列容器)and associative containers(关联容器)

The standard sequence containers include vectordeque, and list

The standard associative containers are setmultisetmapmultimaphash_sethash_maphash_multiset and hash_multimap.

 

 There are also container adaptors(适配器) queuepriority_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

 

 

 

 

posted on 2018-09-18 19:23 lMimjx 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值