`
xpp02
  • 浏览: 1013321 次
社区版块
存档分类
最新评论

C++ 标准库 vector list map使用方法

 
阅读更多
  1. List(链表)
List将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.

list对象函数

assign() 给list赋值
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear() 删除所有元素
empty() 如果list是空的则返回true
end() 返回末尾的迭代器
erase() 删除一个元素
front() 返回第一个元素
get_allocator() 返回list的配置器
insert() 插入一个元素到list中
max_size() 返回list能容纳的最大元素数量
merge() 合并两个list
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素
rbegin() 返回指向第一个元素的逆向迭代器
remove() 从list删除元素
remove_if() 按指定条件删除元素
rend() 指向list末尾的逆向迭代器
resize() 改变list的大小
reverse() 把list的元素倒转
size() 返回list中的元素个数
sort() 给list排序
splice() 合并两个list
swap() 交换两个list
unique() 删除list中重复的元素

List实例代码

  1. #include<iostream>
  2. #include<list>
  3. #include<numeric>
  4. #include<algorithm>
  5. usingnamespacestd;
  6. //创建一个list容器的实例LISTINT
  7. typedeflist<int>LISTINT;
  8. //创建一个list容器的实例LISTCHAR
  9. typedeflist<char>LISTCHAR;
  10. intmain(void)
  11. {
  12. //--------------------------
  13. //用list容器处理整型数据
  14. //--------------------------
  15. //用LISTINT创建一个名为listOne的list对象
  16. LISTINTlistOne;
  17. //声明i为迭代器
  18. LISTINT::iteratori;
  19. //从前面向listOne容器中添加数据
  20. listOne.push_front(2);
  21. listOne.push_front(1);
  22. //从后面向listOne容器中添加数据
  23. listOne.push_back(3);
  24. listOne.push_back(4);
  25. //从前向后显示listOne中的数据
  26. cout<<"listOne.begin()---listOne.end():"<<endl;
  27. for(i=listOne.begin();i!=listOne.end();++i)
  28. cout<<*i<<"";
  29. cout<<endl;
  30. //从后向后显示listOne中的数据
  31. LISTINT::reverse_iteratorir;
  32. cout<<"listOne.rbegin()---listOne.rend():"<<endl;
  33. for(ir=listOne.rbegin();ir!=listOne.rend();ir++){
  34. cout<<*ir<<"";
  35. }
  36. cout<<endl;
  37. //使用STL的accumulate(累加)算法
  38. intresult=accumulate(listOne.begin(),listOne.end(),0);
  39. cout<<"Sum="<<result<<endl;
  40. cout<<"------------------"<<endl;
  41. //--------------------------
  42. //用list容器处理字符型数据
  43. //--------------------------
  44. //用LISTCHAR创建一个名为listOne的list对象
  45. LISTCHARlistTwo;
  46. //声明i为迭代器
  47. LISTCHAR::iteratorj;
  48. //从前面向listTwo容器中添加数据
  49. listTwo.push_front('A');
  50. listTwo.push_front('B');
  51. //从后面向listTwo容器中添加数据
  52. listTwo.push_back('x');
  53. listTwo.push_back('y');
  54. //从前向后显示listTwo中的数据
  55. cout<<"listTwo.begin()---listTwo.end():"<<endl;
  56. for(j=listTwo.begin();j!=listTwo.end();++j)
  57. cout<<char(*j)<<"";
  58. cout<<endl;
  59. //使用STL的max_element算法求listTwo中的最大元素并显示
  60. j=max_element(listTwo.begin(),listTwo.end());
  61. cout<<"ThemaximumelementinlistTwois:"<<char(*j)<<endl;
  62. return0;
  63. }


vector相关用法

vector的初始化大小和赋初值
(1)vector< 类型 > 标识符 ;
(2)vector< 类型 > 标识符(最大容量) ;
(3)vector< 类型 > 标识符(最大容量,初始所有值);
vector< int > arry(5, 1);
注:定义一个大小为5的数组,并将每个值都赋为1;
int i;
for( i = 0; i < 5; i ++ )
cout << arry[i] << " ";
输出结果为:1 1 1 1 1
同理定义其他类型的:
vector<char> arry(3, '*');
定义二维的vector:
vector< vector <int>> Arry(10, vector<int>(0));

使用数组对C++ Vector进行初始化
int i[10] ={1,2,3,4,5,6,7,78,8} ;
///第一种
vector<int> vi(i+1,i+3); ///从第2个元素到第三个元素
for(vector <int>::interator it = vi.begin() ;
it != vi.end() ; it++)
{
cout << *it <<" " ;
}


vector 的数据的存入和输出:

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. usingnamespacestd;
  6. intmain(void)
  7. {
  8. vector<int>num;//STL中的vector容器
  9. intelement;
  10. //从标准输入设备读入整数,
  11. //直到输入的是非整型数据为止
  12. while(cin>>element)//ctrl+Z结束输入
  13. num.push_back(element);
  14. //STL中的排序算法
  15. sort(vi.begin(),vi.end());///从小到大
  16. reverse(vi.begin(),vi.end())///从大道小
  17. //将排序结果输出到标准输出设备
  18. for(inti=0;i<num.size();i++)
  19. cout<<num[i]<<"\n";
  20. //也可以这样做
  21. system("pause");
  22. return0;
  23. }
对于二维vector的定义。
1)定义一个10个vector元素,并对每个vector符值1-10。
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<iostream>
  4. usingnamespacestd;
  5. intmain()
  6. {
  7. inti=0,j=0;
  8. //定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。
  9. 所以每一行的长度是可以变化的。之所以用到vector<int>(0)是对vector初始化,否则不能对vector存入元素。
  10. vector<vector<int>>Array(10,vector<int>(0));
  11. for(j=0;j<10;j++)
  12. {
  13. for(i=0;i<9;i++)
  14. {
  15. Array[j].push_back(i);
  16. }
  17. }
  18. for(j=0;j<10;j++)
  19. {
  20. for(i=0;i<Array[j].size();i++)
  21. {
  22. cout<<Array[j][i]<<"";
  23. }
  24. cout<<endl;
  25. }
  26. }

定义一个行列都是变化的数组。
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<iostream>
  4. usingnamespacestd;
  5. voidmain()
  6. {
  7. inti=0,j=0;
  8. vector<vector<int>>Array;
  9. vector<int>line;
  10. for(j=0;j<10;j++)
  11. {
  12. Array.push_back(line);//要对每一个vector初始化,否则不能存入元素。
  13. for(i=0;i<9;i++)
  14. {
  15. Array[j].push_back(i);
  16. }
  17. }
  18. for(j=0;j<10;j++)
  19. {
  20. for(i=0;i<Array[j].size();i++)
  21. {
  22. cout<<Array[j][i]<<"";
  23. }
  24. cout<<endl;
  1. <spanstyle="white-space:pre"></span>return0;
  2. }
  3. }
使 用 vettor erase 指定元素
  1. #include<iostream>
  2. #include<vector>
  3. usingnamespacestd;
  4. intmain()
  5. {
  6. vector<int>arr;
  7. arr.push_back(6);
  8. arr.push_back(8);
  9. arr.push_back(3);
  10. arr.push_back(8);
  11. for(vector<int>::iteratorit=arr.begin();it!=arr.end();)
  12. {
  13. if(*it==8)
  14. {
  15. it=arr.erase(it);
  16. }
  17. else
  18. {
  19. ++it;
  20. }
  21. }
  22. cout<<"Afterremove8:\n";
  23. for(vector<int>::iteratorit=arr.begin();it<arr.end();++it)
  24. {
  25. cout<<*it<<"";
  26. }
  27. cout<<endl;
  28. return0;
  29. }
附:
1.push_back 在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
v.resize(2*v.size, 99) 将v的容量翻倍(并把新元素的值初始化为99)
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据


map用法

1、map简介

map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。

2、map的功能

自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
快速插入Key - Value 记录。
快速删除记录
根据Key 修改value记录。
遍历所有记录。
3、使用map

使用map得包含map类所在的头文件

#include <map> //注意,STL头文件没有扩展名.h

map对象是模板类,需要关键字和存储对象两个模板参数:

std:map<int, string> personnel;

这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.

为了使用方便,可以对模板类进行一下类型定义,

typedef map<int, CString> UDT_MAP_INT_CSTRING;

UDT_MAP_INT_CSTRING enumMap;

4、在map中插入元素

改变map中的条目非常简单,因为map类已经对[]操作符进行了重载

enumMap[1] = "One";

enumMap[2] = "Two";

.....

这样非常直观,但存在一个性能的问题。插入2时,先在enumMap中查找主键为2的项,没发现,然后将一个新的对象插入enumMap,键是2,值是一个空字符串,插入完成后,将字符串赋为"Two"; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:

enumMap.insert(map<int, CString> :: value_type(2, "Two"))

5、查找并获取map中的元素

下标操作符给出了获得一个值的最简单方法:

CString tmp = enumMap[2];

但是,只有当map中有这个键的实例时才对,否则会自动插入一个实例,值为初始化值。

我们可以使用Find()和Count()方法来发现一个键是否存在。

查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.

int nFindKey = 2; //要查找的Key

//定义一个条目变量(实际是指针)

UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);

if(it == enumMap.end()) {

//没找到

}

else {

//找到

}

通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据

6、从map中删除元素

移除某个map中某个条目用erase()

该成员方法的定义如下

iterator erase(iterator it); //通过一个条目对象删除
iterator erase(iterator first, iterator last); //删除一个范围
size_type erase(const Key& key); //通过关键字删除
clear()就相当于 enumMap.erase(enumMap.begin(), enumMap.end());

C++ STL map的使用

以下是对C++中STL map的插入,查找,遍历及删除的例子:

  1. #include<map>
  2. #include<string>
  3. #include<iostream>
  4. usingnamespacestd;
  5. voidmap_insert(map<string,string>*mapStudent,stringindex,stringx)
  6. {
  7. mapStudent->insert(map<string,string>::value_type(index,x));
  8. }
  9. intmain(intargc,char**argv)
  10. {
  11. chartmp[32]="";
  12. map<string,string>mapS;
  13. //insertelement
  14. map_insert(&mapS,"192.168.0.128","xiong");
  15. map_insert(&mapS,"192.168.200.3","feng");
  16. map_insert(&mapS,"192.168.200.33","xiongfeng");
  17. map<string,string>::iteratoriter;
  18. cout<<"WeHaveThirdElement:"<<endl;
  19. cout<<"-----------------------------"<<endl;
  20. //findelement
  21. iter=mapS.find("192.168.0.33");
  22. if(iter!=mapS.end()){
  23. cout<<"findtheelememt"<<endl;
  24. cout<<"Itis:"<<iter->second<<endl;
  25. }else{
  26. cout<<"notfindtheelement"<<endl;
  27. }
  28. //seeelement
  29. for(iter=mapS.begin();iter!=mapS.end();iter){
  30. cout<<"|"<<iter->first<<"|"<<iter->
  31. second<<"|"<<endl;
  32. }
  33. cout<<"-----------------------------"<<endl;
  34. map_insert(&mapS,"192.168.30.23","xf");
  35. cout<<"AfterWeInsertOneElement:"<<endl;
  36. cout<<"-----------------------------"<<endl;
  37. for(iter=mapS.begin();iter!=mapS.end();iter){
  38. cout<<"|"<<iter->first<<"|"<<iter->
  39. second<<"|"<<endl;
  40. }
  41. cout<<"-----------------------------"<<endl;
  42. //deleteelement
  43. iter=mapS.find("192.168.200.33");
  44. if(iter!=mapS.end()){
  45. cout<<"findtheelement:"<<iter->first<<endl;
  46. cout<<"deleteelement:"<<iter->first<<endl;
  47. cout<<"================================="<<endl;
  48. mapS.erase(iter);
  49. }else{
  50. cout<<"notfindtheelement"<<endl;
  51. }
  52. for(iter=mapS.begin();iter!=mapS.end();iter){
  53. cout<<"|"<<iter->first<<"|"<<iter->
  54. second<<"|"<<endl;
  55. }
  56. cout<<"================================="<<endl;
  57. return0;
  58. }


本文参考:

http://blog.csdn.net/lyn_bigdream/article/details/6601510

http://blog.sina.com.cn/s/blog_63a1163f0100jxr9.html

http://wmnmtm.blog.163.com/blog/static/38245714201072310131130/
分享到:
评论

相关推荐

    vector list map pair stl 标准模板库 c++

    vector list map pair stl 标准模板库 c++ 程序示例

    C++STL vector list map set dqueue 等应用举例及PPT讲解示例,代码演示

    C++STL vector list map set dqueue 等应用举例及PPT讲解示例,代码演示

    c++容器list、vector、map、set区别与用法详解

    c++容器list、vector、map、set区别 list 封装链表,以链表形式实现,不支持[]运算符。 对随机访问的速度很慢(需要遍历整个链表),插入数据很快(不需要拷贝和移动数据,只需改变指针的指向)。 新添加的元素,...

    C++模板(vector、map、multimap、set、multiset)

    一共四个doc文件,list综合实例、multimap和map的实例、set和multiset的综合实例、vector综合实例

    STL讲义其中包含部分有: vector list map,还有一些例子

    STL讲义,其中包含部分有: vector list map,还有一些例子

    C++标准库(第2版)STL 源码

    STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。现然主要出现在C++中,但在被引入C++...在C++标准中,STL被组织为下面的13个头文件:、、、、&lt;vector&gt;、&lt;list&gt;、&lt;map&gt;、、、、、和。

    【STL源代码】C++标准库STL源代码下载

    【STL源代码】中包含了许多常用的数据结构(如vector、list、map等)和算法(如排序、查找、遍历等)。通过阅读代码可以仔细研究这些数据结构和算法的实现,了解它们的内部工作原理和使用方式。

    C++中STL的基本用法总结

    C++的STL string vector list stack queue set map 等常用的容器使用

    C标准库源代码(学习C/C++必备)

    C标准库源代码\LIST C标准库源代码\LOADDLL.C C标准库源代码\LOCALE C 标准库源代码\LOCALE.CPP C标准库源代码\LOCALE.H C标准库源代码\LOCALE0.CPP C标准库源代码\LOCALTIM.C C标准库源代码\LOCKING.C C标准库源...

    C++标准库(第二版)英文版.pdf

    C++标准库(第二版)英文版.pdf 非扫描版+源代码 Prefaceto the SecondEdition xxiii Acknowledgments for the SecondEdition xxiv Prefaceto the FirstEdition xxv Acknowledgments for the FirstEdition xxvi 1 ...

    C++标准模板库STL初步(1)

    组成的库来说提供了更好的代码重用...在C++标准中,STL被组织为下面的几个头文件:、&lt;vector&gt;、&lt;list&gt;、、、、、&lt;map&gt;、、、、、和。文件中主要介绍了前面八个的使用,并且重点介绍了他们的属性和一些成员函数的使用。

    C++标准模板库源代码

    C++标准模板库源代码主要涉及下面几个内容: vector 向量 deque 双端队列 list 链表 map 映射 multiset 多重集合 queue 队列 set 集合 stack 堆栈。

    C++标准模板库STL初步(2)

    组成的库来说提供了更好的代码重用...在C++标准中,STL被组织为下面的几个头文件:、&lt;vector&gt;、&lt;list&gt;、、、、、&lt;map&gt;、、、、、和。文件中主要介绍了前面八个的使用,并且重点介绍了他们的属性和一些成员函数的使用。

    C++标准模版库使用简介

    目录 一、 模板简单介绍: 3 1. 函数模板 3 ...1.1 Vector 7 1.2 List 16 2. 关联式容器: 22 2.1 Set 22 2.2 multiset 24 2.3 map 27 2.4 multimap 29 五、 写在后面 34 六、 附录:如何选择容器 34

    C++标准程序库STL的架构

    5 STL标准程序库 16 5.1 STL组件 16 5.1.1 分类 16 5.1.2 基本观念 16 5.1.3 好处 16 5.2 容器(containers) 16 5.2.1 分类 16 5.2.2 序列式容器示例 16 5.2.3 关联式容器 18 5.3 迭代器 18 5.3.1 示例 19 5.3.2 ...

    tree(c++ tree容器)

    该源码可用于建立树结构的数据结构,与c++标准库中中vector, list, map等用法完全相同,只需要在程序中包含该头文件即可使用,可以作为标准库的补充

    C++头文件大全.pdf

    容器:vector、list、deque、set、map、unordered_set、unordered_map等 迭代器:iterator 算法:algorithm 文件操作:fstream、cstdio 异常处理:exception 时间和日期:chrono、ctime 数学函数:cmath、cstdlib 多...

    c++参考手册 2018版

    map − unordered_map (C++11) priority_queue − span (C++20) 其他容器: 顺序 − 关联 无序关联 − 适配器 迭代器库 范围库 (C++20) 算法库 数值库 常用数学函数 特殊数学函数 (C++17) 数值算法 伪随机...

    本例程提供了C++的STL常用数据结构及其算法的使用范例,比如vector、string、list

    本例程提供了C++的STL常用数据结构及其算法的使用范例,比如vector、string、list、forward_list、deque、queue、stack、map、set、multimap、multiset、tuple、bitset的使用范例,以及algorithm常….zip

Global site tag (gtag.js) - Google Analytics