C++ STL容器的学习使用(vector、queue、list、set、map)
来源:互联网 发布:java web实训项目总结 编辑:程序博客网 时间:2024/05/16 19:33
1.STL组成:STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(containeradaptor),函数对象(functor),除此之外还有STL其他标准组件。通俗的讲:
容器:装东西的东西,装水的杯子,装咸水的大海,装人的教室……STL里的容器是可容纳一些数据的模板类。
算法:就是往杯子里倒水,往大海里排污,从教室里撵人……STL里的算法,就是处理容器里面数据的方法、操作。
迭代器:往杯子里倒水的水壶,排污的管道,撵人的那个物业管理人员……STL里的迭代器:遍历容器中数据的对象。对存储于容器中的数据进行处理时,迭代器能从一个成员移向另一个成员。他能按预先定义的顺序在某些容器中的成员间移动。对普通的一维数组、向量、双端队列和列表来说,迭代器是一种指针。
容器: 学习list/vector/deque/set/multisets/map/multimaps/
(1)vector:动态数组,向量。(具体用法看代码)
#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>#include <queue>#include <stack>#include <vector>#include <list>#include <set>#include <map>using namespace std;#define N 10010#define LL __int64typedef vector<int> INTVECTOR;typedef deque<int> INTDEQUE;int main() {freopen("in.in","r",stdin);//freopen("out.out","w",stdout);int n,m;vector <int> vec1; //vec1初始为空vector <int> vec2(10,6);//vec2最初由10个值为6的元素vector <int> vec3(vec2.begin(),vec2.begin()+3); //vec3最初由3个值为6的元素。//声明迭代器vector<int> ::iterator i;//从前向后显示vec1中的数据 :迭代器输出使用 *icout<<"vec1.begin()---vec1.end():"<<endl;for(i=vec1.begin();i!=vec1.end();i++){cout<<*i<<" ";}cout<<endl;//测试添加和插入成员函数(注意:vector不支持从前插入)vec1.push_back(2); //从后面添加一个成员vec1.push_back(4);vec1.insert(vec1.begin()+1,5); //在vec1的第一个位置上插入成员5vec1.insert(vec1.begin()+1,vec3.begin(),vec3.end()); //在vec1的第一个位置上插入vec3的所有成员//测试赋值成员函数(重新给vector中的某一位上的元素赋值)vec2.assign(8,1); //vec2的8个成员初始值设为1//访问vector数组中的某一位置上的元素cout<<vec2[2]<<endl;//删除和移出vec1.pop_back(); //删除vec1的最后一个元素vec1.erase(vec1.begin()+1,vec1.end()-2);cout<<"vec.pop_back() and vec1.erase():"<<endl;for(i=vec1.begin();i!=vec1.end();i++)cout<<*i<<" "; cout<<endl;//显示序列消息:vector中数组也是从 0 ~ vec1.size(),左闭右开//获取vector的大小: vec1.size();//清空vector: vec1.clear();vec1.clear();cout<<"vec1.empty():"<<endl;for(i=vec1.begin();i!=vec1.end();i++)cout<<*i<<" "; cout<<endl;return 0;}
(2)queue:双端队列:支持vector不支持的push_front();
void put_deque(INTDEQUE deque,char *name){INTDEQUE::iterator pdeque; //定义迭代器输出cout<<"The contents of "<<name<<" : ";for(pdeque = deque.begin();pdeque!=deque.end();pdeque++){cout<<*pdeque<<" ";}cout<<endl;}int main(){//测试deque的各种函数功能INTDEQUE deq1;INTDEQUE deq2(10,6);INTDEQUE:: iterator i;//末尾插入元素并打印deq1.push_back(2);deq1.push_back(4);put_deque(deq1,"deq1");//前面添加两个元素deq1.push_front(5);deq1.push_front(7);put_deque(deq1,"deq1");//中间插入数据deq1.insert(deq1.begin()+1,3,9); //插入三个9put_deque(deq1,"deq1");//数据访问:都表示下坐标cout<<deq1[1]<<" "<<deq1.at(5)<<endl;//数据删除:从前后,以及按位置删除//deq1.pop_front();//deq1.pop_back();deq1.erase(deq1.begin()+4); //删除下坐标为4的数。put_deque(deq1,"deq1");//数据修改deq1.assign(8,1); //全部赋值为了1put_deque(deq1,"deq1");deq1.clear(); //清空dequeput_deque(deq1,"deq1");return 0;}
(3)list:链表,双向链表,只能顺序访问,不能使用[]进行随机访问
void printList(list<int> n){for(list<int>::iterator i=n.begin();i!=n.end();i++)cout<< *i << " ";cout<<endl;}int main(){list<int> list1,list2;list1.push_back(123);list1.push_back(0);list1.push_back(34);list2.push_back(100);list2.push_back(12);//测试list排序功能printList(list1);list1.sort();printList(list1);list2.sort();list1.merge(list2); //两个链表排序后进行合并,合并完仍然有序printList(list1);return 0;}
(4)set和multisets:集和多集:默认是排好序的!
·set:包含元素唯一
·multisets:包含元素可不唯一
int main(){set<int> set1;for(int i=0;i<10;i++) set1.insert(i);for(set<int>::iterator p = set1.begin();p!=set1.end();p++){cout<<*p<<" ";}cout<<endl;//计算set中值为2的元素个数cout<<set1.count(2)<<endl;//插入元素:可重复multiset<int> A;A.insert(set1.begin(),set1.end());A.insert(4); //插入之后默认排好序for(multiset<int>::iterator i=A.begin();i!=A.end();i++)cout<<*i<<" "; cout<<endl;return 0;}
(5)map和multimaps:映射和多重映射
set中的key和value是Key类型的,而map中的key和value是一个pair结构中的两个分量。Map支持下表运算符operator[],用访问普通数组的方式访问map,不过下标为map的键。在multimap中一个键可以对应多个不同的值。
int main(){//定义map: char是键的类型,int是值的类型map<char,int,less<char> > map1;map<char,int,less<char> >::iterator mapIter;//注意这里: 两个>>符号之间 要有一个空格//初始化map1['c'] = 3;map1['d'] = 4;map1['a'] = 1;//打印for(mapIter=map1.begin();mapIter!=map1.end();mapIter++){cout<<" "<<(*mapIter).first<<" : "<<(*mapIter).second;}cout<<endl;//其中first对应定义中的char键,second对应定义中的int//检索map<char,int ,less<char> >::const_iterator t = map1.find('d');cout<<"t:"<<(*t).first<<"对应值:"<<(*t).second<<endl;cout<<map1['d']<<endl<<endl; //也可以直接这样访问//-----------------------multimap------------------------multimap<string,string,less<string> >mulmap;multimap<string,string,less<string> >::iterator p;typedef multimap<string,string,less<string> >::value_type vt;//注意multimap中不支持map中的[]下标操作!!!//mulmap[string("songjs")] = string("bjfu"); --- 是错误的mulmap.insert(vt(string("songjs"),string("is a boy")));mulmap.insert(vt(string("songjs"),string("is a girl")));//打印输出for(p=mulmap.begin();p!=mulmap.end();p++){cout<<(*p).first<<" "<<(*p).second<<endl;}return 0;}
1 0
- C++ STL容器的学习使用(vector、queue、list、set、map)
- STL容器 list、vector、map、set 使用的陷阱
- c++STL容器(map,set,vector,stack,queue)
- STL 各种容器 vector deque list set map multiset map multimap stack queue priority_queue
- (STL容器) vector. list. set. deque. map.
- STL中的容器使用比较(string vector list deque set map)
- stl容器区别(内存布局和使用场合): vector list deque set map
- Java容器学习:List、Set、Queue、Map
- STL讲解 容器(map,set,vector,stack,queue)
- STL 整理map、set、vector、list、stack、queue、deque、priority_queue
- STL详解(vector,list,deque,stack,queue,priority_queue;map,set)
- C++STL(vector,map,set,list)成员函数整理
- C++STL练习<queue> <set>容器使用
- STL基本容器: string、vector、list、deque、set、map
- stl之容器区别: vector list deque set map
- stl容器区别: vector list deque set map-底层实现
- STL常用容器简介 vector deque list map set
- stl容器区别: vector list deque set map-底层实现
- Poker UI - 1
- 复杂的json字符串转换为javabean对象
- javascript 作用域链实例
- Autolayout - 2 (sizeClass)
- 遇到的几个算法题
- C++ STL容器的学习使用(vector、queue、list、set、map)
- 一根560亿美元的“小草”:任正非要华为向美国学习开放
- Autolayout - 3
- Java入门----各周作业汇总
- gem5的安装与使用
- Eclipse常用的高效插件
- linux 配置 ip地址
- context是如何泄漏的 - Handlers和内部类
- NodeJS写日志_Log4js使用详解+常见困难的解决