一、 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的声明如下:

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

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

using namespace std; 

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

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中某个位置进行操作。一般用法:
vector<Data_Type>::iterator iter; // iter为迭代器名,Data_Type为vector中元素的类型

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

insert , push_back, pop, remove, erase,  assign

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

(1)赋值函数 assign

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

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

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

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

调用实例:

 #include<iostream>
#include <vector>
using namespace std; int main()
{
vector<int> v1;
vector<int> v2;
vector<int> v3;
int from[] = {,,}; v1.assign(,); // 填充
cout<<v1.size()<<endl; v2.assign(v1.begin().v1.end()); //vector同类型复制
cout<<v2.size()<<endl; v3.assign(from, from+); //连续内存复制
cout<<v3.size()<<endl; return ;
}

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

iterator insert (iterator position, const value_type& val); //单元素定点插入    

void insert (iterator position, size_type n, const value_type& val);    //定点多元素填充插入

template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last); //定点连续内存覆盖插入

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

实现实例:

 #include <iostream>
#include <vector>
using namespace std; vector<int> vi; void print(vector<int> v)
{
vector<int>::iterator iter;
for(iter = v.begin(); iter!= v.end();iter++)
{
cout<<*iter<<" ";
}
cout<<endl;
} int main()
{
vi.clear();
vector<int>::iterator iter;
iter = vi.begin();
/******************************************************
* insert(iterator pos,int n,elem_type elem);
* 在pos位置及之后的n-1个位置上插入元素elem
******************************************************/
vi.insert(iter,,);
print(vi); vi.clear(); //清空vector
for(int i=;i<;i++)
vi.push_back(i);
print(vi); vi.clear();
iter = vi.begin();
/******************************************************
* insert(iterator pos,elem_type elem);
* 在pos位置上插入元素elem
******************************************************/
for(int j=;j<;j++)
vi.insert(iter+j,j); /******************************************************
* insert(iterator pos, iterator begin, iterator end);
* 将vi中的[begin,end]之间的数据在pos位置上插入
******************************************************/
vi.insert(iter, vi.begin(), vi.end());
print(vi);
return ;
}

insert实现

与insert类似的函数还有:

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

(4)删除函数erase

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

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

 #include <iostream>
#include <vector>
using namespace std; int main ()
{
vector<int> myvector; // 赋值操作
for (int i=; i<=; i++) myvector.push_back(i); // 删除第6个元素
myvector.erase (myvector.begin()+); // 删除连续的3个元素
myvector.erase (myvector.begin(),myvector.begin()+); cout << "myvector contains:";
for (unsigned i=; i<myvector.size(); ++i)
cout << ' ' << myvector[i];
cout << '\n'; return ;
}

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. linux weather

  2. Python小知识点(3)--装饰器

    (1)装饰器含参数,被装饰函数不含(含)参数 实例代码如下: import time # 装饰器函数 def wrapper(func): def done(*args,**kwargs): star ...

  3. SQL中Like语句的语法

    在SQL结构化查询语言中,LIKE语句有着至关重要的作用. LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用 ...

  4. Halcon标定

    摄像头拍摄时候,图像均有畸变,但是图像的扭曲变形均是有规律的成线性的,所以可以通过算法矫正.halcon标定过程需要在镜头内放置标定板:标定板一般选用30*30mm的:可以通过halcon程序来制作: ...

  5. iOS学习之UIDatePicker控件使用

    iOS上的选择时间日期的控件是这样的,左边是时间和日期混合,右边是单纯的日期模式. ,   您可以选择自己需要的模式,Time, Date,Date and Time  , Count Down Ti ...

  6. Android 4.x 获取存储卡路径的方式

    http://blog.sina.com.cn/s/blog_8daaa9ea0101mx7f.html     以前的Android(4.1之前的版本)中,SDcard跟路径通过“/sdcard”或 ...

  7. Fog

    [Fog] Fog parameters are controlled with Fog command. Fogging blends the color of the generated pixe ...

  8. Android Studio 无法正确引入包内存在的类

    Android Studio 无法识别同一个 package 里的类,显示为红色,但是 compile 没有问题. 重启,rebuild,clean都没有用. 多半是因为 Android Studio ...

  9. 关于java是值传递还是引用传递

    一.概念 实际上对这两种传递方式,知乎上有个回答说得很好: 值传递和引用传递,属于函数调用时参数的求值策略(Evaluation Strategy),这是对调用函数时,求值和传值的方式的描述,而非传递 ...

  10. 建立spring项目入门实例

    建立maven项目 打开pop.xml文件 添加springframework所依赖的包 <!-- https://mvnrepository.com/artifact/org.springfr ...