一、 Vector简要描述

vector是C++标准模版库STL提出的一种顺序存储结构,之所以称之为“容器”,是因为vector是一个模板类,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构。通过设置vector的参数允许我们制定容器汇总的元素的数据类型,可以将许多重复而乏味的工作简化。

众所周知,常用的数据结构有array(数组)、list(链表)、tree(树)、stack(栈)、heap(堆)、queue(队列)、hash table(散列表)、set(集合)、map(映射表)等。 --摘自《STL源码剖析》by 侯捷

根据在容器中的排列特性,这些数据结构分为序列式容器(sequence container)和关联式容器(associative container)。

序列式容器: 关联式容器:
Array: C++的内建数据结构   RB-tree(Red-Black Tree,红黑树)
heap: 通过算法的方式实现(大顶堆/小顶堆) map/mulitmap: 内部实现方式,RB-Tree
priority-queue: 本质还是heap,通过算法的方式实现 set/multiset: 内部实现方式,RB-Tree
list/slist:链表  [hash table]: 非标准
deque: 双向链表

[hash_multiset]: 非标准

[hash_mutimap]:非标准

stack/queue: 适配器,底层由deque实现

[hash_set]:  非标准

[hash_map]: 非标准

需要指出的是:

1. vector在内存中是顺序存储的,其满足顺序数据结构的特征:支持顺序访问和随机访问。

2. 在C++程序中,如果没有特殊说明或者特殊要求的话,当需要使用动态数组时,请尽量使用vector,避免用户自己定义动态数组。理由如下:

(1) vector虽然本质上的实现方式还是动态数组,但是作为STL一员,vector提供了许多封装好的函数,并且其内部实现经过了大量的测试与优化,使得用户使用更为方便。

(2) vector就C++用户自定义的动态数组在元素的动态插入和删除方面,提供了较为方便的库函数,避免用户在指针使用上出现不必要的错误。

3. 虽然vector提供了元素的动态插入和删除操作,但是当程需要频繁的插入和删除操作的时候,vector就不适用了,而应该使用deque或者list。

二、Vector用法

1. vector容器的定义:(参考自:http://www.cplusplus.com/reference/vector/vector/

在C++98标准中,vector的声明如下:

  1. template < class T, class Alloc = allocator<T> > class vector; // generic template

由于vector是STL的一员,所以在程序中需要定义vector时,需要引用命名空间std:

  1. using namespace std; 

在程序中定义一个某一特定类型的vector的方式如下:

  1. vector<Data_Type> vi; // vi为vector的变量名, Data_Type为vi中元素的类型

2. vector类中成员变量

具体的成员变量如下:

member type

definition

notes

value_type

The first template parameter (T)

allocator_type

The second template parameter (Alloc)

defaults to:allocator<value_type>

reference

allocator_type::reference

for the default allocator:value_type&

const_reference

allocator_type::const_reference

for the default allocator: const value_type&

pointer

allocator_type::pointer

for the default allocator:value_type*

const_pointer

allocator_type::const_pointer

for the default allocator: const value_type*

iterator

a random access iterator to value_type

convertible to const_iterator

const_iterator

a random access iterator to const value_type

reverse_iterator

reverse_iterator<iterator>

const_reverse_iterator

reverse_iterator<const_iterator>

difference_type

a signed integral type, identical to:iterator_traits<iterator>::difference_type

usually the same as ptrdiff_t

size_type

an unsigned integral type that can represent any non-negative value of difference_type

usually the same as size_t

在众多成员变量中,我们经常会用到iterator,这个有很多中叫法:游标,迭代器。

 
该变量用于对vector中某个位置进行操作。一般用法:
  1. vector<Data_Type>::iterator iter; // iter为迭代器名,Data_Type为vector中元素的类型

会破坏迭代器的函数操作,任何插入和删除操作:

insert , push_back, pop, remove, erase,  assign

3. vector中常用函数的用法:

(1)赋值函数 assign

  1. template <class InputIterator>
  2. void assign (InputIterator first, InputIterator last); //1. 复制
  3. void assign (size_type n, const value_type& val); // 2. 填充

若定义某vector<value_tpye> 对象 vi, 那么vi的成员函数assign,有两种实现方法:

填充,自vi的头部开始连续的n个元素都填入元素值val。

复制,将另一个vector或者某种连续存储的区间的某一个区间复制到新的vector vi之中。

调用实例:

  1. #include<iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. vector<int> v1;
  8. vector<int> v2;
  9. vector<int> v3;
  10. int from[] = {,,};
  11.  
  12. v1.assign(,); // 填充
  13. cout<<v1.size()<<endl;
  14.  
  15. v2.assign(v1.begin().v1.end()); //vector同类型复制
  16. cout<<v2.size()<<endl;
  17.  
  18. v3.assign(from, from+); //连续内存复制
  19. cout<<v3.size()<<endl;
  20.  
  21. return ;
  22. }

assign使用方法

(2)访问函数at 

参考:http://www.cplusplus.com/reference/vector/vector/at/

对于at的使用,需要注意其返回值为reference,v.at(pos)表示的是在vector中pos所在的位置上的元素。

ps: at函数是Exception safety的,也就是说当at访问的是一个非法地址的时候,at会throw一个out of range的异常,不会有内存溢出。

与at类似的函数还有:

begin: 返回vector首元素的地址

front: 返回vector第一个元素值

end: 返回vector尾元素的地址

back :   返回vector最后一个元素的值


(3) 插入函数 insert

  1. iterator insert (iterator position, const value_type& val); //单元素定点插入
  2.  
  3. void insert (iterator position, size_type n, const value_type& val); //定点多元素填充插入
  4.  
  5. template <class InputIterator>
  6. void insert (iterator position, InputIterator first, InputIterator last); //定点连续内存覆盖插入

与assign函数类似,对vector进行插入操作insert的实现也是分为填充和复制,不过多了一个单元素插入的操作,此外就是insert函数规定了插入的位置。

实现实例:

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. vector<int> vi;
  6.  
  7. void print(vector<int> v)
  8. {
  9. vector<int>::iterator iter;
  10. for(iter = v.begin(); iter!= v.end();iter++)
  11. {
  12. cout<<*iter<<" ";
  13. }
  14. cout<<endl;
  15. }
  16.  
  17. int main()
  18. {
  19. vi.clear();
  20. vector<int>::iterator iter;
  21. iter = vi.begin();
  22. /******************************************************
  23. * insert(iterator pos,int n,elem_type elem);
  24. * 在pos位置及之后的n-1个位置上插入元素elem
  25. ******************************************************/
  26. vi.insert(iter,,);
  27. print(vi);
  28.  
  29. vi.clear(); //清空vector
  30. for(int i=;i<;i++)
  31. vi.push_back(i);
  32. print(vi);
  33.  
  34. vi.clear();
  35. iter = vi.begin();
  36. /******************************************************
  37. * insert(iterator pos,elem_type elem);
  38. * 在pos位置上插入元素elem
  39. ******************************************************/
  40. for(int j=;j<;j++)
  41. vi.insert(iter+j,j);
  42.  
  43. /******************************************************
  44. * insert(iterator pos, iterator begin, iterator end);
  45. * 将vi中的[begin,end]之间的数据在pos位置上插入
  46. ******************************************************/
  47. vi.insert(iter, vi.begin(), vi.end());
  48. print(vi);
  49. return ;
  50. }

insert实现

与insert类似的函数还有:

push_back(value_type & value); 只能在vector的末尾加入value.

(4)删除函数erase

  1. iterator erase (iterator position); //删除单个元素
  2. iterator erase (iterator first, iterator last); //删除连续区间内的元素

由于删除某一个元素之后迭代器会失效,所以需要特别注意连续删除的时候迭代器计数问题。

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int main ()
  6. {
  7. vector<int> myvector;
  8.  
  9. // 赋值操作
  10. for (int i=; i<=; i++) myvector.push_back(i);
  11.  
  12. // 删除第6个元素
  13. myvector.erase (myvector.begin()+);
  14.  
  15. // 删除连续的3个元素
  16. myvector.erase (myvector.begin(),myvector.begin()+);
  17.  
  18. cout << "myvector contains:";
  19. for (unsigned i=; i<myvector.size(); ++i)
  20. cout << ' ' << myvector[i];
  21. cout << '\n';
  22.  
  23. return ;
  24. }

erase使用

类似函数: clear:清空vector中的元素

(5) 容量函数 size

在vector中与容量有关的函数有:

capacity

返回系统当前为vector分配的内存大小

size

返回当前vector中元素的个数

max_size

返回系统能够为vector分配的最大内存的大小

resize(int rsize,value_type elem)

改变当前vector的大小成rsize:

1)如果rsize大于当前vector的大小n,则将[n,rsize-1]区间内填充elem

elem 默认值为0

2)如果resize小于当前vector大小n,则将当前的vector截取rsize大小

resize使用方法resize实现:

参考:http://www.cplusplus.com/reference/vector/

转载请指明出处http://www.cnblogs.com/double-win/,谢谢~

vector容器(一)的更多相关文章

  1. 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...

  2. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  3. vector容器使用和assert断言关键字

    C++里面的容器是个比较复杂的东西,我这篇只说vector容器怎么使用,详细的网搜. vector模板类其实是一个动态数组,跟自己用new关键字创建数组一样,只不过vector会自动帮我们用new和d ...

  4. C++杂谈(二)初识vector容器与迭代器

    教科书中失踪的vector 很奇怪的一件事情,在当时学习C++的时候,老师并没有讲授容器的内容,当时参考的谭浩强老师的红皮C++也没有这个内容,不知为何.后来再学C++,发现容器是一个很重要的概念,在 ...

  5. vector容器的用法

    转自一篇博客^-^: 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.p ...

  6. C++ Daily《2》----vector容器的resize 与 reserve的区别

    C++ STL 库中 vector 容器的 resize 和 reserve 区别是什么? 1. resize 改变 size 大小,而 reserve 改变 capacity, 不改变size. 2 ...

  7. 跟我一起学STL(2)——vector容器详解

    一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...

  8. vector容器+iterator迭代器

    关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm   关于iterator迭代器的描述,可参考http://www.cppblog.c ...

  9. 提高Vector容器的删除效率

    vector容器是类似与一个线性数组,索引效率高,插入,删除的效率很低,需要遍历数据列表,一般情况下vector的删除操作由一下函数完成: iterator erase(iterator positi ...

  10. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

随机推荐

  1. 根据不同分辨率载入相应CSS样式表

    index.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:// ...

  2. 论XGBOOST科学调参

    XGBOOST的威力不用赘述,反正我是离不开它了. 具体XGBOOST的原理可以参见之前的文章<比XGBOOST更快--LightGBM介绍> 今天说下如何调参. bias-varianc ...

  3. C# 判断字体是否存在以及安装

        1. 字体安装 在实际开发项目中,需要在客户端安装字体,一种是通过代码将字体文件复制到系统FONT目录即可,另一种通过安装文件实现,至于其他方式还未知晓. 1.1 软安装 public cla ...

  4. adb命令检测apk启动时间、内存、CPU使用情况、流量、电池电量等——常用的adb命令

    ADB:Android Debug Bridge,是Android SDK里一个可以直接操作安卓模拟器或真实设备的工具,颇为强大.   检测APP:   adb shell am start -W p ...

  5. 修改SecureCRT终端的Home和End功能键。

    SecureCRT真是个不错的ssh客户端工具,但在使用时发现跟自己的一些使用习惯不符合,例如home.end.pageup.pagedown和delete等键. 默认情况下一些按键的功能如下: pa ...

  6. tree的所有节点都勾选上或者取消勾选

    还有一个功能,就是让tree的所有节点都勾选上或者取消勾选,在api中找了一下有一个方法: check target 选中指定节点. 那我们只能是选中根节点后,实现全选. getRoot none 获 ...

  7. 【314】putty 自动登录

    putty是一款好用的远程登录linux服务器软件,但每次输入用户名密码毕竟有些烦人,这里教你免用户名密码登陆. 本教程通过 *.bat 文件进行添加参数,下面为相应的代码: 方法一:(直接将密码/用 ...

  8. javascript 模拟选择下拉框的某一个option元素的效果

    需要在单元测试模拟它,百度谷歌了好久都没有.后来认真想想,还是找到办法了.因为我们手动交互某一行为,首先是让它的某些属性发生变化,其次是让它触发某事件.想明白这一点就简单了.让属性发生变化,当然是改动 ...

  9. ElasticSearch中如何让query should等同于filter should

    bool query must The clause (query) must appear in matching documents. should The clause (query) shou ...

  10. 去除winrar弹出购买许可证的提示

    我们在使用winrar压缩包管理器时,经常会遇到弹出购买许可证的提示,影响了我们操作软件的友好性,接下来我们就来处理避免这种情况的再次发生.弹出购买许可证的图形如下: 处理方法如下: 新建一个记事本文 ...