【总集】C++ STL类库 vector 使用方法
介绍:
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 使用方法的更多相关文章
- C++的STL中vector内存分配方法的简单探索
STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux CentOS 5.2 1.代码 #include <vector> #include <stdio ...
- C++Vector使用方法
C++内置的数组支持容器的机制,可是它不支持容器抽象的语义.要解决此问题我们自己实现这种类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用须要的头文 ...
- STL中的nth_element()方法的使用
STL中的nth_element()方法的使用 通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比 ...
- C++STL之Vector向量详解,用法和例子 一起学习 一起加油
C++ STL之vector用法总结 1 ...
- STL中vector、list、deque和map的区别
1 vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...
- C++-STL:vector用法总结
目录 简介 用法 1. 头文件 2. vector的声明及初始化 3. vector基本操作 简介 vector,是同一类型的对象的集合,这一集合可看作可变大小的数组,是顺序容器的一种.相比于数组,应 ...
- 【C++】STL,vector容器操作
C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...
- STL之vector常用函数笔记
STL之vector常用函数笔记 学会一些常用的vector就足够去刷acm的题了 ps:for(auto x:b) cout<<x<<" ";是基于范围的 ...
- STL 之 vector 用法
一.头文件 #include<vector> 二.常用方法: // 在这个向量的尾部插入x的考贝,平均时间为常数,最坏时间为O(n): 1: void push_back(const T& ...
随机推荐
- React Native开发时devices offline和手机不能晃动的处理
1. adb device 显示 devices offline 可能重启adb server: $ adb kill-server $ adb start-server 2. 华为等手机不能 晃动显 ...
- leetcode378 Kth Smallest Element in a Sorted Matrix
思路1: 使用堆. 实现: class Solution { public: int kthSmallest(vector<vector<int>>& matrix, ...
- 浅析document和window的区别
1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2 ...
- AndroidStudio进行Build时出现DexArchiveMergerException异常的解决办法
今天在AndroidStudio中导入了一个项目,编译的时候没有什么问题,但是在执行Rebuild Project 和 Build APK(s)时报错了,提示: Error:Execution fai ...
- Android WiFi使用记录
最近在做Android的WiFi部分的开发,连接的工具类参照了这个文章的工具类. http://www.cnblogs.com/zhuqiang/p/3566686.html 开发中碰上的一些问题,在 ...
- 【NumPy学习指南】day4 多维数组的切片和索引
ndarray支持在多维数组上的切片操作.为了方便起见,我们可以用一个省略号(...)来 表示遍历剩下的维度. (1) 举例来说,我们先用arange函数创建一个数组并改变其维度,使之变成一个三维数组 ...
- numpy.random.randint
low.high.size三个参数.默认high是None,如果只有low,那范围就是[0,low).如果有high,范围就是[low,high). >>> np.random.ra ...
- CSS在线压缩
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- vue新手入坑之mounted和created的区别(生命周期)
这几个月用vue框架新做了一个项目,也算是边学习边实践吧.学习中也看过一些别人的开源项目,起初对mounted和created有一些疑惑,查询相关资料发现,这和vue的生命周期有关,在此也就做一个总结 ...
- HDU - 4802 - GPA (水题)
题意: 计算GPA,输入一个数字和一个字符串,用 数字×字符串对应的数值 思路: 用map对应数值,要注意的是字符串为P或者N的时候,不计入结果 代码: #include<iostream> ...