【总集】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& ...
随机推荐
- PHP知识点总结3
PHP 函数 PHP 的真正威力源自于它的函数. 在 PHP 中,提供了超过 1000 个内建的函数. <html> <body> <?php function writ ...
- AJPFX关于线程创建的方式
创建线程的第一种方式:继承Thread ,由子类复写run方法. 步骤: 1,定义类继承Thread类: 2,目的是复写run方法,将要让线程运行的代码都存储到run方法中: 3,通过创建Thread ...
- let和const注意点
let 一.块级作用域 下面的代码如果使用var,最后输出的是10. var a = []; for (var i = 0; i < 10; i++) { a[i] = function () ...
- Vuex.js状态管理共享数据 - day8
VScode文件目录: amount.vue代码如下: <template> <div> <!-- <h3>{{ $store.state.count }}& ...
- iOS操作系统的层次结构
iOS操作系统4层结构,如下表 可触摸层 Cocoa Touch layer 媒体层 Media layer 核心服务层 Core Services layer 核心操作系统层 Core OS lay ...
- Spark中Java函数的使用方法笔记
1: map 函数map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD. 任何原RDD中的元素在新RDD中都有且只有一个元素与之对应. 2: mapPartitions函数</p ...
- MySQL优化汇总
1)mysql优化汇总,转载自网络
- Flask信号流程
首先先我们来看看Flask里面的信号是什么样的,我们可以找到一个叫signals.py的文件 这里面是所有定义了的后面请求流程中会用到的信号 二.哪些地方用到了信号 1.请求app上下文时执行的,在执 ...
- numpy.random.randint
low.high.size三个参数.默认high是None,如果只有low,那范围就是[0,low).如果有high,范围就是[low,high). >>> np.random.ra ...
- github+hexo+themes搭建简易个性主题博客
0x00 install Node.js and git 安装Node.js:http://www.runoob.com/nodejs/nodejs-install-setup.html 安装git ...