STL常见容器的使用

本博客内容:
一、vector
二、map
三、set
四、list
五、deque
六、queue
七、stack

一、vector

参考:http://blog.sina.com.cn/s/blog_933dc4350100x9pz.html

一、构造函数
vector();
vector(个数n,值value);//构造n个value
vector(const vector& from);//从from中构造一个相同的
vector(input_iterator start,input_iterator end);
二、运算符
v[] 取值
v1==v2  v1!=v2
v1<=v2   v1>=v2   v1<v2   v1>v2
三、assign函数
void assign(input_iterator start,input_iterator end);
void assign(num,value);
三、at函数
相比下标访问,当越界时它会抛出异常
四、back()   front()  返回的是值
五、begin()   end()  返回的是迭代器   rbegin()  rend()
六、capacity()函数   返回当前vector在重新进行内存分配以前所能容纳的元素数量
七、clear()函数  
八、erase()函数
iterator erase(iterator loc); //erase函数删出指定位置loc的元素
iterator erase(iterator start,iterator end);
九、insert()函数
iterator insert(iterator loc,const TYPE & val);//指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
void insert(iterator loc,size_type num,const TYPE &val);//指定位置loc前插入num个值为val的元素
void insert(iterator loc,input_iterator start,input_iterator end);
十、max_size()函数 返回能容纳的数量的最大值
十一、reserve(size_type size); 为当前vector预留至少size个元素的空间
十二、resize(size,val); 改变当前vector大小为size,且对新创建元素赋值为val
十三、size()   swap(vector & from);

标准库函数的使用

1.unique函数
使用前需要对元素排序
去重代码:
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
//该函数将重复的元素放到vector的尾部,并且指向第一个重复元素的迭代器,再用erase函数擦除这个元素到最后元素的所有的元素

二、map

查找复杂度log(N)
如果有1000个数字,最多查找10次
每个关键字只能在map中出现一次
map内部自建一颗红黑树(非严格意义的平衡二叉树)
这棵树具有对数据自动排序的功能,在map内部所有的数据都是有序的。

一、构造函数**************************** 
map<int,string>mp;
二、数据的插入**************************
①
mp.insert(pair<int,string>(1,"one"));
map<int ,string>::iterator iter;
for(iter=mp.begin();iter!=mp.end();iter++)
    cout<<iter->first<<iter->second<<endl;
②
mp.insert(map<int,string>::value_type(2,"two"));
③  数组方式
mp[3]="three"; 
上述3种方法 有区别,insert函数插入时,当有这个关键字时,insert操作是插入数据不了的。
但是用数组方式是覆盖的。
map<int,string>iterator itor;//迭代器
三、数据的查找(包括关键字是否在map中出现)*************
可以使用Find()和Count()方法来发现一个键是否存在。
map在数据插入时保证有序
①
用count函数来判定关键字是否出现,其缺点是无法定位数据,由于map的特性,一对一的映射关系,决定了count函数的返回值只有2个,要么是0,要么是1。
②
用find函数来定位数据出现位置,它返回的是一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,返回的迭代器等于end函数返回的迭代器。
③
如下图采用lower_bound()和upper_bound()函数
四、删除函数erase
① 通过迭代器删除
② 删除一个范围
③ 通过关键字删除

http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html
lower_bound()和upper_bound()
这里写图片描述

三、set

实现了红黑树的平衡二叉树的数据结构,会自动调整二叉树的排列,把该元素放到适当的位置。
插入删除仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率高。
元素是唯一的,默认情况下对元素自动进行升序排序,支持集合的交、差、并。

一、创建
set<int>s;
二、插入
s.insert(5);
set<int>::iterator it;//定义前向迭代器
set<int>::reverse_iterator itor; //定义反向迭代器
三、删除  erase函数
四、检索   find函数   很基本的使用

四、list

list容器是一个双向链表,可以高效地插入删除元素
头文件list

一、构造
list<int>c0;空链表
list<int>c1(3); 建一个含3个默认值是0的元素的链表
list<int>c2(5,2); 建一个含5个元素的链表,值都是2
...
二、其他函数都有,例如push_back  pop_back  push_front pop_front
三、
合并函数:
c1.merge(c2) 合并2个有序的链表并使之有序,重新放入到c1中,释放c2;
c1.merge(c2,comp); 合并2个有序的链表按照自定义的规则,释放c2;
连接函数:
c1.splice(c1.begin(),c2);将c2连接到c1的开头处
c1.splice(c1.end(),c2);将c2连接到c1的结尾处
c1.splice(c1.begin(),c2,c2.begin());只将c2开头位置的那个值连接到c1的开头位置上,然后释放c2
c1.splice(c1.begin(),c2,c2.begin(),c2.end());将c2的begin和end之间的元素连接到c1的开头处,并释放c2[begin,end]之间的元素。
移除函数:
remove(num) 删除链表中匹配num的元素
reverse() 反转链表
unique () 只会去除相邻的元素
c.sort() 将链表排序,默认升序

五、deque

头文件deque

一、构造函数
deque<int> c(n,value);  n个值为value
二、成员函数
各种重复的,push_back  push_front pop_back  pop_front

六、queue

入队:q.push(x); 连到末端
出队: q.pop(); 弹出第一个
q.front()  访问队首
q.back()  访问队尾
q.empty()  是否为空

七、stack

入栈:s.push(x);
出栈: s.pop();
栈顶、判空、尺寸

猜你喜欢

转载自blog.csdn.net/xiongluo0628/article/details/82290781