STL基本容器的使用
2017-07-29 14:14
337 查看
声明:
本文综合
http://blog.csdn.net/conanswp/article/details/23297441
http://www.cnblogs.com/LonelyEnvoy/p/5850679.html
http://blog.csdn.net/bingxuebage/article/details/5729064
而编辑。
基本容器介绍
1 vector
11 定义和初始化
12 常用方法
13 遍历
14 例程
2 deque
21 例程
3 list
31 定义和初始化
32 常用操作方法
33 遍历
34 例程
容器类自动申请和释放内存,因此无需new和delete操作。
通常使用步骤如下:
容器模板中常用的函数有:
为了帮助理解向量的概念,这里写了一个小例子,其中用到了vector的成员函数:begin(),end(),push_back(),assign(),front(),back(),erase(),empty(),at(),size()。
此外deque也不支持与vector的capacity()、reserve()类似的操作。
只能顺序访问(从前向后或者从后向前)。与前面两种容器类有一个明显的区别就是:它不支持随机访问。要访问表中某个下标处的项需要从表头或表尾处(接近该下标的一端)开始循环。而且缺少下标预算符:operator[]。
firs1t为第一个容器的首迭代器,last1为第一个容器的末迭代器,first2为第二个容器的首迭代器,last2为容器的末迭代器,result为存放结果的容器,comapre为比较函数(可略写,默认为合并为一个升序序列)。
本文综合
http://blog.csdn.net/conanswp/article/details/23297441
http://www.cnblogs.com/LonelyEnvoy/p/5850679.html
http://blog.csdn.net/bingxuebage/article/details/5729064
而编辑。
基本容器介绍
1 vector
11 定义和初始化
12 常用方法
13 遍历
14 例程
2 deque
21 例程
3 list
31 定义和初始化
32 常用操作方法
33 遍历
34 例程
1.基本容器介绍
C++中有两种类型的容器:顺序容器和关联容器。顺序容器主要有vector、list、deque等。其中vector表示一段连续的内存,基于数组实现,list表示非连续的内存,基于链表实现,deque与vector类似,但是对首元素提供插入和删除的双向支持。关联容器主要有map和set。map是key-value形式,set是单值。map和set只能存放唯一的key,multimap和multiset可以存放多个相同的key。容器类自动申请和释放内存,因此无需new和delete操作。
通常使用步骤如下:
大致有下面6个步骤: 1.添加相应的头文件(如 #include <list> )( 注意,没有 .h ) 2.添加std命名空间(用 using namespace std; ) 3.赋予模板具体的使用类型(如 typedef list<string> LISTSTR; ) 4.实例化模板(如 LISTSTR test; ) 5.实例化游标(如 LISTSTR::iterator i; ) 6.通过迭代器对象访问模板对象,例如 // 逐个输出链表test中的元素 for ( i = test.begin(); i != test.end(); ++i ) cout << *i << " ";
容器模板中常用的函数有:
assign() //赋值 empty() //容器为空则返回非0值 erase() //删除指定位置或指定范围内的元素 push_front() //从容器头部插入元素 push_back() //从容器尾部插入元素 pop_front() //删除第一个元素 pop_back() // 删除最后一个元素 back() //返回最后一个元素的引用 front() //返回第一个元素的引用 begin() //返回指向第一个元素的游标 (与迭代器配合使用) end() //返回指向最后一个元素的后一个位置的游标 (最后1个元素再加1) (与迭代器配合使用)
1.1 vector
vector基于模板实现,需包含头文件vector。1.1.1 定义和初始化
//1.定义和初始化 vector<int> vec1; //默认初始化,vec1为空 vector<int> vec2(vec1); //使用vec1初始化vec2 vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2,效果同上 vector<int> vec4(10); //10个值为0的元素 vector<int> vec5(10,4); //10个值为4的元素
1.1.2 常用方法
vec1.push_back(100); //添加元素 int size = vec1.size(); //元素个数 bool isEmpty = vec1.empty(); //判断是否为空 cout<<vec1[0]<<endl; //取得第一个元素 vec1.insert(vec1.end(),5,3); //从vec1.back位置插入个值为的元素 vec1.pop_back(); //删除末尾元素 vec1.erase(vec1.begin(),vec1.end());//删除之间的元素,其他元素前移 cout<<(vec1==vec2)?true:false; //判断是否相等==、!=、>=、<=... vector<int>::iterator iter = vec1.begin(); //获取迭代器首地址 vector<int>::const_iterator c_iter = vec1.begin(); //获取const类型迭代器 vec1.clear(); //清空元素
1.1.3 遍历
//下标法 int length = vec1.size(); for(int i=0;i<length;i++) { cout<<vec1[i]; } cout<<endl<<endl; //迭代器法 vector<int>::const_iterator iterator = vec1.begin(); for(;iterator != vec1.end();iterator++) { cout<<*iterator; }
1.1.4 例程
#include <cstring> #include <vector> #inc 4000 lude <iostream> using namespace std; int ar[10] = { 12, 45, 234, 64, 12, 35, 63, 23, 12, 55 }; char* str = "Hello World"; int main() { vector <int> vec1(ar, ar + 10); //first=ar,last=ar+10,不包括ar+10 vector < char > vec2(str, str + strlen(str)); //first=str,last= str+strlen(str), //打印vec1和vec2,const_iterator是迭代器,后面会讲到 //size()是vector的一个成员函数 cout << "vec1:" << endl; cout << "size is "<<vec1.size() << endl; /* for (int i=0; i<vec1.size(); i++)cout << vec1[i];*/ /* 这种方式也可以*/ for (vector<int>::const_iterator p = vec1.begin(); p != vec1.end(); p++) cout << *p<<" "; cout << endl; cout << "size is " << vec2.size() << endl; cout <<"vec2:" << endl; for (vector< char >::const_iterator p1 = vec2.begin(); p1 != vec2.end(); p1++) cout << *p1; cout << endl; return 0; }
为了帮助理解向量的概念,这里写了一个小例子,其中用到了vector的成员函数:begin(),end(),push_back(),assign(),front(),back(),erase(),empty(),at(),size()。
#include <iostream> #include <vector> using namespace std; //使用typedef自定义类型INTVECTOR typedef vector<int> INTVECTOR; //测试vector容器的功能 int main() { //vec1对象初始为空 INTVECTOR vec1; //vec2对象最初有10个值为6的元素 INTVECTOR vec2(10, 6); //vec3对象最初有3个值为6的元素,拷贝构造 INTVECTOR vec3(vec2.begin(), vec2.begin() + 3); //声明一个名为i的双向迭代器 INTVECTOR::iterator i; //从前向后显示vec1中的数据 cout << "vec1.begin()--vec1.end():" << endl; for (i = vec1.begin(); i != vec1.end(); ++i) cout << *i << " "; cout << endl; //从前向后显示vec2中的数据 cout << "vec2.begin()--vec2.end():" << endl; for (i = vec2.begin(); i != vec2.end(); ++i) cout << *i << " "; cout << endl; //从前向后显示vec3中的数据 cout << "vec3.begin()--vec3.end():" << endl; for (i = vec3.begin(); i != vec3.end(); ++i) cout << *i << " "; cout << endl; //测试添加和插入成员函数,vector不支持从前插入 vec1.push_back(2);//从后面添加一个成员 vec1.push_back(4); vec1.insert(vec1.begin() + 1, 5);//在vec1第一个的位置(vec1[1])上插入成员5 //从vec1第一的位置开始插入vec3的所有成员 vec1.insert(vec1.begin() + 1, vec3.begin(), vec3.end()); cout << "after push() and insert() now the vec1 is:" << endl; for (i = vec1.begin(); i != vec1.end(); ++i) cout << *i << " "; cout << endl; //测试赋值成员函数 vec2.assign(8, 1); // 重新给vec2赋值,8个成员的初始值都为1 cout << "vec2.assign(8,1):" << endl; for (i = vec2.begin(); i != vec2.end(); ++i) cout << *i << " "; cout << endl; //测试引用类函数 cout << "vec1.front()=" << vec1.front() << endl;//vec1第零个成员 cout << "vec1.back()=" << vec1.back() << endl;//vec1的最后一个成员 cout << "vec1.at(4)=" << vec1.at(4) << endl;//vec1的第五个成员 cout << "vec1[4]=" << vec1[4] << endl; //测试移出和删除 vec1.pop_back();//将最后一个成员移出vec1 vec1.erase(vec1.begin() + 1, vec1.end() - 2);//删除成员,减几后边留几个 cout << "vec1.pop_back() and vec1.erase():" << endl; for (i = vec1.begin(); i != vec1.end(); ++i) cout << *i << " "; cout << endl; //显示序列的状态信息 cout << "vec1.size(): " << vec1.size() << endl;//打印成员个数 cout << "vec1.empty(): " << vec1.empty() << endl;//清空 }
1.2 deque
deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。其余类似vector操作方法的使用。此外deque也不支持与vector的capacity()、reserve()类似的操作。
1.2.1 例程
#include <iostream> #include <deque> using namespace std; typedef deque<int> INTDEQUE;//用typedef定义 //从前向后显示deque队列的全部元素的子函数 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; } //测试deqtor容器的功能 int main() { //deq1对象初始为空 INTDEQUE deq1; //deq2对象最初有10个值为6的元素 INTDEQUE deq2(10, 6); //声明一个名为i的双向迭代器变量 INTDEQUE::iterator i; //从前向后显示deq1中的数据 put_deque(deq1, "deq1"); //从前向后显示deq2中的数据 put_deque(deq2, "deq2"); //从deq1序列后面添加两个元素 deq1.push_back(2); deq1.push_back(4); cout << "deq1.push_back(2) and deq1.push_back(4):" << endl; put_deque(deq1, "deq1"); //从deq1序列前面添加两个元素 deq1.push_front(5); deq1.push_front(7); cout << "deq1.push_front(5) and deq1.push_front(7):" << endl; put_deque(deq1, "deq1"); //在deq1序列中间插入数据 deq1.insert(deq1.begin() + 1, 3, 9); cout << "deq1.insert(deq1.begin()+1,3,9):" << endl; put_deque(deq1, "deq1"); //测试引用类函数 cout << "deq1.at(4)=" << deq1.at(4) << endl; cout << "deq1[4]=" << deq1[4] << endl; deq1.at(1) = 10; deq1[2] = 12; cout << "deq1.at(1)=10 and deq1[2]=12 :" << endl; put_deque(deq1, "deq1"); //从deq1序列的前后各移去一个元素 deq1.pop_front(); deq1.pop_back(); cout << "deq1.pop_front() and deq1.pop_back():" << endl; put_deque(deq1, "deq1"); //清除deq1中的第2个元素 deq1.erase(deq1.begin() + 1); cout << "deq1.erase(deq1.begin()+1):" << endl; put_deque(deq1, "deq1"); //对deq2赋值并显示 deq2.assign(8, 1); cout << "deq2.assign(8,1):" << endl; put_deque(deq2, "deq2"); return 0; }
1.3 list
List是stl实现的双向链表,与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。需要添加头文件list。只能顺序访问(从前向后或者从后向前)。与前面两种容器类有一个明显的区别就是:它不支持随机访问。要访问表中某个下标处的项需要从表头或表尾处(接近该下标的一端)开始循环。而且缺少下标预算符:operator[]。
1.3.1 定义和初始化
定义和初始化 list<int> lst1; //创建空list list<int> lst2(3); //创建含有三个元素的list list<int> lst3(3,2); //创建含有三个元素的list list<int> lst4(lst2); //使用lst2初始化lst4 list<int> lst5(lst2.begin(),lst2.end()); //同lst4
1.3.2 常用操作方法
常用操作方法 lst1.assign(lst2.begin(),lst2.end()); //分配值 lst1.push_back(10); //添加值 lst1.pop_back(); //删除末尾值 lst1.begin(); //返回首值的迭代器 lst1.end(); //返回尾值的迭代器 lst1.clear(); //清空值 bool isEmpty1 = lst1.empty(); //判断为空 lst1.erase(lst1.begin(),lst1.end()); //删除元素 lst1.front(); //返回第一个元素的引用 lst1.back(); //返回最后一个元素的引用 lst1.insert(lst1.begin(),3,2); //从指定位置插入个 lst1.rbegin(); //返回第一个元素的前向指针 lst1.remove(2); //相同的元素全部删除 lst1.reverse(); //反转 lst1.size(); //含有元素个数 lst1.sort(); //排序 lst1.unique(); //删除相邻重复元素
1.3.3 遍历
和前两个类似//迭代器法 for(list<int>::const_iterator iter = lst1.begin();iter != lst1.end();iter++) { cout<<*iter; } cout<<endl;
1.3.4 例程
merge函数的作用是:将两个有序的序列合并为一个有序的序列。函数参数merge(first1,last1,first2,last2,result,compare)
firs1t为第一个容器的首迭代器,last1为第一个容器的末迭代器,first2为第二个容器的首迭代器,last2为容器的末迭代器,result为存放结果的容器,comapre为比较函数(可略写,默认为合并为一个升序序列)。
#include <iostream> #include <string> #include <list> using namespace std; void PrintIt(list<int> n) { for (list<int>::iterator iter = n.begin(); iter != n.end(); ++iter) cout << *iter << " ";//用迭代器进行输出循环 } int main() { list<int> listn1, listn2; //给listn1,listn2初始化 listn1.push_back(123); listn1.push_back(0); listn1.push_back(34); listn1.push_back(1123); //now listn1:123,0,34,1123 listn2.push_back(100); listn2.push_back(12); //now listn2:12,100 listn1.sort(); listn2.sort(); //给listn1和listn2排序 //now listn1:0,34,123,1123 listn2:12,100 cout << "listn1 is "<<endl; PrintIt(listn1); cout << endl; cout << "listn2 is "<<endl; PrintIt(listn2); cout << endl; cout << "after merge is " << endl; listn1.merge(listn2); //合并两个排序列表后,listn1:0,12,34,100,123,1123 PrintIt(listn1); cout << endl; }
相关文章推荐
- C++ STL基本容器的使用
- C++ STL基本容器的使用
- C++ STL基本容器的使用
- C++ STL基本容器的使用
- C++ STL基本容器的使用
- C++ STL容器部分 有关queue 队列模型的 一些基本API函数的使用
- C++ STL基本容器的使用
- C++ STL 基本容器使用
- C++ STL基本容器的使用
- C++ STL基本容器的使用
- C++ STL基本容器的使用
- STL的基本使用之关联容器:map和multiMap的基本使用
- C++ STL基本容器的使用
- C++ STL基本容器的使用
- C++ STL基本容器的使用
- C++ STL基本容器使用
- STL的基本使用之关联容器:set和multiSet的基本使用
- C++ STL基本容器的使用(vector、list、deque、map、stack、queue)
- STL中容器的类型和基本特征——《c++ primer plus第五版》学习小结(转)
- STL容器的基本特性和特征