转自:https://blog.csdn.net/studentyyl/article/details/21177445

vector是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。

在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定,这个大小即capacity()函数的返回值。当存储的数据超过分配的空间时vector 会重新分配一块内存块,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作:

首先,vector 会申请一块更大的内存块;

然后,将原来的数据拷贝到新的内存块中;

其次,销毁掉原内存块中的对象(调用对象的析构函数);

最后,将原来的内存空间释放掉。

如果vector 保存的数据量很大时,这样的操作一定会导致糟糕的性能(这也是vector 被设计成比较容易拷贝的值类型的原因)。所以说vector 不是在什么情况下性能都好,只有在预先知道它大小的情况下vector 的性能才是最优的。

vector 的特点:

(1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样操作,并且可以进行动态操作。通常体现在push_back() pop_back() 。

(2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at()

(3) 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是要明确一点vector 大多情况下并不是满存的,在未存储的区域实际是浪费的。

(4) 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。Vector 被设计成只能在后端进行追加和删除操作,其原因是vector 内部的实现是按照顺序表的原理。

(5) 只能在vector 的最后进行push 和pop ,不能在vector 的头进行push 和pop 。

(6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷贝与释放,这个操作非常消耗性能。 所以要vector 达到最优的性能,最好在创建vector 时就指定其空间大小。

Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。

1.Constructors 构造函数

vector<int> v1; //构造一个空的vector

vector<int> v1( 5, 42 ); //构造了一个包含5个值为42的元素的Vector

2.Operators 对vector进行赋值或比较

C++ Vectors能够使用标准运算符: ==, !=, <=, >=, <, 和 >.

要访问vector中的某特定位置的元素可以使用 [] 操作符.

两个vectors被认为是相等的,如果:

1.它们具有相同的容量

2.所有相同位置的元素相等.

vectors之间大小的比较是按照词典规则.

3.assign() 对Vector中的元素赋值

语法:

void assign( input_iterator start, input_iterator end );

// 将区间[start, end)的元素赋到当前vector

void assign( size_type num, const TYPE &val );

// 赋num个值为val的元素到vector中,这个函数将会清除掉为vector赋值以前的内容。

4.at() 返回指定位置的元素

语法:

TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全;

5.back() 返回最末一个元素

6.begin() 返回第一个元素的迭代器

7.capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)

8.clear() 清空所有元素

9.empty() 判断Vector是否为空(返回true时为空)

10.end() 返回最末元素的迭代器(译注:实指向最末元素的下一个位置)

11.erase() 删除指定元素

语法:

iterator erase( iterator loc );//删除loc处的元素

iterator erase( iterator start, iterator end );//删除start和end之间的元素

12.front() 返回第一个元素的引用

13.get_allocator() 返回vector的内存分配器

14.insert() 插入元素到Vector中

语法:

iterator insert( iterator loc, const TYPE &val );

//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,

void insert( iterator loc, size_type num, const TYPE &val );

//在指定位置loc前插入num个值为val的元素

void insert( iterator loc, input_iterator start, input_iterator end );

//在指定位置loc前插入区间[start, end)的所有元素

15.max_size() 返回Vector所能容纳元素的最大数量(上限)

16.pop_back() 移除最后一个元素

17.push_back() 在Vector最后添加一个元素

18.rbegin() 返回Vector尾部的逆迭代器

19.rend() 返回Vector起始的逆迭代器

20.reserve() 设置Vector最小的元素容纳数量

//为当前vector预留至少共容纳size个元素的空间

21.resize() 改变Vector元素数量的大小

语法:

void resize( size_type size, TYPE val );

//改变当前vector的大小为size,且对新创建的元素赋值val

22.size() 返回Vector元素数量的大小

23.swap() 交换两个Vector

语法:

void swap( vector &from );

Vector用法 :

1.声明:

一个vector类似于一个动态的一维数组。

vector<int> a; //声明一个元素为int类型的vector a

vectot<MyType> a; //声明一个元素为MyType类型的vector a

这里的声明的a包含0个元素,既a.size()的值为0,但它是动态的,其大小会随着数据的插入和删除改变而改变。

vector<int> a(100, 0); //这里声明的是一个已经存放了100个0的整数vector

你可以用以下的几种方法声明一个 vector 对象:

vector<float> v(5, 3.25); //初始化有5 个元素,其值都是3.25

vector<float> v_new1(v);

vector<float> v_new2 = v;

vector<float> v_new3(v.begin(), v.end());

这四个vector 对象是相等的,可以用operator==来判断。

2.向量操作

常用函数:

size_t size(); // 返回vector的大小,即包含的元素个数

void pop_back(); // 删除vector末尾的元素,vector大小相应减一

void push_back(); //用于在vector的末尾添加元素

T back(); // 返回vector末尾的元素

void clear(); // 将vector清空,vector大小变为0

其他访问方式:

cout<<a[5]<<endl;

cout<<a.at(5)<<endl;

以上区别在于后者在访问越界时会抛出异常,而前者不会。

3.遍历

(1). for(vector<datatype>::iterator it=a.begin(); it!=a.end();it++)

cout<<*it<<endl;

(2). for(int i=0;i<a.size;i++)

cout<<a[i]<<endl;

现在想得到容器中能保存的最大元素数量就可以用 vector 类的成员函数max_size():

vector<shape>::size_type max_size = my_shapes.max_size();

当前容器的实际尺寸 --- 已有的元素个数用size():

vector<shape>::size_type size = my_shapes.size();

就像size_type 描述了vector 尺寸的类型,value_type 说明了其中保存的对象的类型:

cout << “value type: “ << typeid(vector<float>::value_type).name();

输出:

value type: float

可以用capacity()来取得vector 中已分配内存的元素个数:

vector<int> v;

vector<int>::size_type capacity = v.capacity();

vector 类似于数组,可以使用下标[]访问:

vector<int> v(10);

v[0] = 101;

注意到这里预先给10 个元素分配了空间。你也可以使用vector 提供的插入函数来动态的扩

展容器。成员函数push_back()就在vector 的尾部添加了一个元素:

v.push_back(3);

也可以用insert()函数完成同样的工作:

v.insert(v.end(), 3);

这里insert()成员函数需要两个参数:一个指向容器中指定位置的迭代器(iterator),一个待插

入的元素。insert()将元素插入到迭代器指定元素之前。

现在对迭代器(Iterator)做点解释。Iterator 是指针(pointer)的泛化,iterator 要求定义

operator*,它返回指定类型的值。Iterator 常常和容器联系在一起。例子:

vector<int> v(3);

v[0] = 5;

v[1] = 2;

v[2] = 7;

vector<int>::iterator first = v.begin();

vector<int>::iterator last = v.end();

while (first != last)

cout << *first++ << “ “;

上面代码的输出是:

5 2 7

begin()返回的是vector 中第一个元素的iterator,而end()返回的并不是最后一个元素的

iterator,而是past the last element。在STL 中叫past-the-end iterator。

转载于:https://www.cnblogs.com/zb-ml/p/8763305.html

【转】C++ Vector(向量容器)相关推荐

  1. java中vector容器,vector向量容器(常用的使用方法总结)

    关于STL中vector容器的学习,编译运行后边看代码,边看执行结果效果更佳,还是想说看别人的代码一百遍,不如自己动手写一遍. vector向量容器不但能像数组一样对元素进行随机访问,还能随时在尾部插 ...

  2. vector向量容器

    一.vector向量容器 简介: Vector向量容器可以简单的理解为一个数组,它的下标也是从0开始的,使用时可以不用确定大小,但是它可以对于元素的插入和删除,可以进行动态调整所占用的内存空间,它里面 ...

  3. vector向量容器元素排序与查找

    1.利用标准库函数sort()对vector进行排序 参考源码: #include <algorithm> #include <vector>vector<int> ...

  4. 4-C++ 中string类、bool类型、模板、array数组、vector向量的基础知识

    目录 继续C++ ------3 ++操作符的友元函数重载 ++操作符的成员函数重载 赋值运算符重载 类型转换运算符 运算符重载注意事项 string类 bool类型的练习 模板 1.函数模板 2.类 ...

  5. c++中的向量容器(vector)

    目录 vector的概念 vector的定义 vector常用的函数 vector的遍历和排序 vector的概念 向量容器vector 动态数组,可以在运行阶段设置长度. 具有数组的快速索引方式. ...

  6. C++ Vector(向量容器)

    Vector介绍 C++ Vector(向量容器) 是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组. ...

  7. STL(模板库)(string)(vector向量)(2019.3.19晚课习题)

    STL,标准模板库,从根本上说是一些''容器''的集合,这些容器有list,vector,set,map等.STL也是一些算法和其他一些组建的集合,STL现在也是c++的一部分,因此不用安装额外的库文 ...

  8. R语言union函数计算数据对象(vector、list、dataframe)的并集:union函数计算两个vector向量、dataframe、列表list的并集

    R语言union函数计算数据对象(vector.list.dataframe)的并集:union函数计算两个vector向量.dataframe.列表list的并集 目录

  9. R语言unique函数计算数据对象(vector、dataframe)的unique独特值:unique函数从vector向量、dataframe中删除重复项、删除dataframe重复行

    R语言unique函数计算数据对象(vector.dataframe)的unique独特值:unique函数从vector向量.dataframe中删除重复项.删除dataframe重复行 目录

  10. ITK:在向量容器上迭代

    ITK:在向量容器上迭代 内容提要 输出结果 C++实现代码 内容提要 VectorContainer的基本操作 输出结果 [1, 2] [2, 3] C++实现代码 #include "i ...

最新文章

  1. spring boot 项目源码_Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent
  2. linux hadoop集群搭建,hadoop集群搭建
  3. 内核驱动漏洞与攻击预防--by MJ0011
  4. C# 接口持有结构体会导致装箱问题
  5. 华为鸿蒙os什么运行内存多大,华为公布鸿蒙OS 2.0硬件安装要求:只要128K内存就能跑...
  6. 忍“乳”负重,身材好的女孩子究竟有多不容易?我从科学的角度算出来了……...
  7. mysql二进制方式_MySQL数据库之MySql二进制连接方式详解
  8. [转载] 《Python语言程序设计》课程笔记
  9. python的三个特性_Python3.9的7个特性
  10. Ubuntu16.04: 和 Windows-7 双系统启动顺序更改
  11. 【大数据部落】IBM SPSS Modeler通过数据挖掘我们能从股市数据得到什么
  12. tg3269c网卡驱动linux,TP-Link TG-3269C驱动
  13. RK3399 Android7.1 AP6212蓝牙可发文件,但收不到文件
  14. 数据时代的大数据思维特征,主要有哪些?
  15. 用python一条命令解决多个ts转换成MP4(就一条),备用两选一
  16. C语言实践项目:2019年个税计算器
  17. 实现对手机联系人列表进行读写操作,并用RecyclerView收缩展开方式展现
  18. 服务器开机后,自动启动某程序,并且打开Google浏览器,全屏展示
  19. 【水质预测】基于matlab模糊神经网络水质预测【含Matlab源码 1923期】
  20. JS学习26:数组对象 之 数组转换为字符串

热门文章

  1. 从零开始学python数据分析-从零开始学Python数据分析与挖掘 PDF 下载
  2. python打印乘法表口诀-用Python打印九九乘法表正三角和倒三角。
  3. python编程入门指南 代码库在哪下-致Python初学者 Anaconda入门使用指南完整版
  4. 自学python可以找到好的工作吗-通过自学python能找到工作吗
  5. spring中事件发布设计与实现
  6. 城市是否可以坐车到达问题
  7. 关于while read line使用read -p失效问题
  8. linux学习(2)——文件和目录管理
  9. 201671010103 2016-2017-2 《Java程序设计》第十二周学习心得
  10. 卷积神经网络CNN与深度学习常用框架的介绍与使用