介绍:

1.vector 的中文名为向量,可以理解为一个序列容器,里面存放的是相同的数据结构类型,类似于数组但与数组又有微妙的不同。

2.vector 采用的是连续动态的空间来存储数据,它是动态的数组,它不仅可以使用下标访问每一个位置的数据,还可以对它的长度进行改变,十分的灵活。但是它的灵活也是有代价的,我们都知道,数组在内存中的长度是开始声明的时候就已经确定好了,要改变长度,就意味着需要重新的去申请空间,再将需要的元素移动到这个空间中,在释放原来的空间,但是 vector 对内存的处理或许并不是这样的,无论我们加多少个值或是删除多少个值来改变 vector 的 size,vector 的头地址始终是不变的,这可能和它的内部实现有关,在这里我也不追究了。

3.vector 同时也有许多的函数方法可以调用,方便我们的数据处理以及内存空间的管理。

4.vector 与其他的序列容器相比 (list, forward_lists, deque 等),vector 适合于随机的访问元素,在需要很多随机增删操作的情况下,或许 vector 就没有那么的好用了。

5.vector 在大多数的情况下还是作为动态来使用,一般用来求解线性的题目。

主要的函数方法以及实例化:

首先需要包含头文件 <vector>

实例化一个 vector:因为 vector 是一个模板类,在实例化的同时我们需要给出数据类型。如:

std::vector<int>v1;//实例化一个存放 int 型数据的 vector,其 size() 为 0,初始值为 0;

std::vector<int>v2(5,1);//实例化一个 size() 为 5 的 vector,且数据的初始值为 1;

std::vector<int>v3(v2);//实例化一个与 v2 相同的 vector,而且可以使用迭代器或数值来确定一个范围。

std::vector<int>v3 = v2;//同上

如果代码中包含了 using namespace std; 则可以不写 std:: 前缀。

1.访问元素操作:

  • 下标访问:v2[3], v3[4], v1[5];//其中 v1[5] 是错误的,因为下标越界了。
  • 使用 at():v2.at(0), v3.at(5);//虽然 v3.at(5) 是错误的,但是会抛出异常。
  • 访问头元素:v2.front();//返回值 int
  • 访问最后一个元素:v3.back();//返回值 int
  • 返回一个指针:int* p = v1.data();//返回一个指向这个数组的指针

2.容量操作:

  • vector 大小:v1.size();//返回 v1 的大小
  • vector 最大容量:v2.max_size();//返回 vector 的最大容量
  • vector 的真实大小:v3.capacity();//返回 v3 在内存中的真实大小
  • 改变 vector 的大小:v1.resize(int);//重新定义 v1 大小
  • 判断 vector 是否为空:v1.empty();//返回一个 bool 值
  • 把 vector 的大小减少到元素存储空间的大小:v2.shrink_to_fit();//使用 shrink_to_fit() 会释放内存,而 erase() 和 clear() 不会释放内存,可以减少内存的占用。

3.修改操作:

  • 末尾添加元素:v1.push_back(val);//返回空值
  • 末尾删除元素:v1.pop_back();//返回空值
  • 任意位置插入元素:v2.insert(val);//可以是一个范围,返回值为一个迭代器
  • 任意位置删除元素:v2.erase();//可以是一个范围或是一个位置,返回值为一个迭代器
  • 交换两个 vector 里的元素:v3.swap(v2);//返回空值
  • 多个元素赋值:v1.assign(5,3);//用于初始化 vector,表示 v1 初始化为 5 个值为 3 的元素;
  • 清空 vector:v3.clear();//返回空值
  • 末尾添加元素:v1.emplace_back();//相等于 push_back(),但比它更有效率(C++11)
  • 任意位置插入元素:v1.emplace();//相等于 insert(),但比它更有效率(C++11)

emplace_back() 能够通过参数构造对象,不需要拷贝或者移动内存,相比于 push_back() 能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升。由此,在大多数情况下应该优先使用 emplace_back() 来代替 push_back()。

4.迭代器:

  • 开始位置:v1.begin();
  • 末尾位置:v1.end();
  • 指向常量的开始位置:v1.cbegin();//意思是不能通过这个迭代器来修改所指的内容(C++11)
  • 指向常量的末尾位置:v1.cend()://但可以通过其他方式修改的,而且迭代器也是可以移动的(C++11)

5.常用算法:

翻转 vector:reverse(v1.begin(),v1.end());

对 vector 进行排序:sort(v1.begin(),v1.end());//从小到大

sort(v1.begin(),v1.end(),Comp);//从大到小

copy(v1.begin(),v1.end(),v2.begin()+1);//把从 v1[0] 到 v1[size()-1] 的数据复制到 v2[1] 中

find(v1.begin(),v1.end(),10);//在 v1[0] 到 v1[size()-1] 中寻找值为 10 的数

几个函数调用的实例:

v1.assign(v2.begin(),v2.begin()+3);
v1.assign(5,3);
v1.front();
v1.back();
vector<int>::iterator=v1.begin();
vector<int>::iterator=v1.end();
v1.at(3);
v1.empty();
v1.clear();
v1.push_back(5);
v1.emplace_back(5);
v1.insert(v1.begin()+1,5);//在v1的第一个位置插入值为5的数据
v1.insert(v1.begin()+1,3,5);//在v1的第一个位置插入3个值为5的数据
v1.insert(v1.begin()+1,v2.begin(),v2.end());//在v1的第一个位置插入v2
v1.emplace(v1.begin(),5);//在v1的头部插入值为5的数据
v1.pop_back();
v1.erase(v1.begin()+3);
v1.erase(v1.begin()+1,v1.begin()+3);
v1.size(5);
v1.resize(10);
v1.resize(10,6);//假如v1原来为{1,2,3,4,5},执行代码后为{1,2,3,4,5,6,6,6,6,6}
v1.capacity();
v1.swap(v2);
v1==v2;
v1=v2;
v1>v2;
v1<v2;
v1[4];
sort(v1.begin(),v1.end());
reverse(v1.begin(),v1.end());
copy(v1.begin(),v1.end(),v2.begin()+1);
find(v1.begin(),v1.end(),10);

提醒一下:迭代器 v1.begin() 到 v1.end() 的范围是 v1[0] 到 v1[v1.size()-1]。例如假设:v1.size()=5,则 v1.begin() 到 v1.end() 的范围是  v1[0] 到 v1[4],它是一个左闭右开的区间。

【总集】C++ STL类库 vector 使用方法的更多相关文章

  1. C++的STL中vector内存分配方法的简单探索

    STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux  CentOS 5.2 1.代码 #include <vector> #include <stdio ...

  2. C++Vector使用方法

    C++内置的数组支持容器的机制,可是它不支持容器抽象的语义.要解决此问题我们自己实现这种类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用须要的头文 ...

  3. STL中的nth_element()方法的使用

    STL中的nth_element()方法的使用 通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比 ...

  4. C++STL之Vector向量详解,用法和例子 一起学习 一起加油

                                                                                    C++ STL之vector用法总结 1 ...

  5. STL中vector、list、deque和map的区别

    1 vector     向量 相当于一个数组    在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...

  6. C++-STL:vector用法总结

    目录 简介 用法 1. 头文件 2. vector的声明及初始化 3. vector基本操作 简介 vector,是同一类型的对象的集合,这一集合可看作可变大小的数组,是顺序容器的一种.相比于数组,应 ...

  7. 【C++】STL,vector容器操作

    C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...

  8. STL之vector常用函数笔记

    STL之vector常用函数笔记 学会一些常用的vector就足够去刷acm的题了 ps:for(auto x:b) cout<<x<<" ";是基于范围的 ...

  9. STL 之 vector 用法

    一.头文件 #include<vector> 二.常用方法: // 在这个向量的尾部插入x的考贝,平均时间为常数,最坏时间为O(n): 1: void push_back(const T& ...

随机推荐

  1. linux 下node升级

    npm install -g n n stable 安装的路径: cd /usr/local/n/versions/node/10.15.3 修改环境变量 cd /etc sudo vim profi ...

  2. awk累加

    {a+=substr($14,1,1)}END{a=(a=="")?0:a;print a}' 对a进行累加,如果最后a=0的话,结果为0,否则为a,最后输出a

  3. IOS之网络状态设和NSUserDefaults的synchronize

    #pragma mark - check net status int apiCheckNetStatus() { Reachability *reachNet = [Reachability rea ...

  4. ipsec配置strongswan.conf和ipsec.conf

    配置strongswan.conf vi /usr/local/etc/strongswan.conf # strongswan.conf - strongSwan configuration fil ...

  5. (四)VMware Harbor 配置文件

    VMware Harbor 配置文件 :harbor.yml # Configuration file of Harbor # The IP address or hostname to access ...

  6. 前端性能优化:细说JavaScript的加载与执行

    本文主要是从性能优化的角度来探讨JavaScript在加载与执行过程中的优化思路与实践方法,既是细说,文中在涉及原理性的地方,不免会多说几句,还望各位读者保持耐心,仔细理解,请相信,您的耐心付出一定会 ...

  7. Bootstrap CSS概览

    HTML5文档类型(<!DOCTYPE html>) Bootstrap前端框架使用了HTML5和CSS属性,为了让这些能正常工作,您需要使用HTML5文档类型(<!DOCTYPE ...

  8. oracle row_number的使用

    create table studentInfo(  id number(8) primary key,  name varchar2(20) not null,  ObjectName varcha ...

  9. iOS 静态库,动态库与 Framework

    iOS 静态库,动态库与 Framework     静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢 ...

  10. path.join()与path.resolve()区别

    1.path.resolve([...paths]) path.resolve() 方法会把一个路径或路径片段的序列解析为一个绝对路径. 给定的路径的序列是从右往左被处理的,后面每个 path 被依次 ...