C++(STL库)之顺序容器vector的使用

一、特点

①总的来说:可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢
②元素保存在连续的内存空间中,因此通过下标取值非常快
③在容器中间位置添加或删除元素非常耗时
④一旦内从重分配,和原vector相关的指针,引用,迭代器都失效。内存重分配耗时很长

二、头文件、using声明

  • 头文件:#include <vector>
  • using声明:using std::vector;

三、初始化

  • vector<T>  v1; ==>v1是一个空的vector
  • vector<T> v2(v1); ===>v2是v1的副本,拷贝构造
  • vector<T> v2=v1; ===>同上
  • vector<T> v1(n,val); ===>初始化n个value
  • vector<T> v1(iter1,iter2); ===>用迭代器iter1与iter2所指的区间内元素进行初始化
  • vector<T> v1(n); ===>初始化n个元素,每个元素使用默认值(int为0,string为空...)
  • vector<T> v1{a,b,c...}; ===>用元素a,b,c进行初始化
  • vector<T> v1={a,b,c...}; ===>同上

四、相关操作

1.运算符

v1==v2;//判断v1和v2是否相等
v1!=v2;//判断v1和v2是否相等
>、>=、<、<= //以字典顺序进行比较

2.取值

索引取值:v[0],v[1],v[2]....

五、相关函数

vector不支持push_front()和emplace_front()

v.empty();//判断是否为空,返回布尔值
v.size();//返回容器中的元素个数
v.max_size();//返回容器的容量
v.front();//得到头元素
v.back();//得到尾元素
v.at(int i);//得到下标i处的元素,若下标越界,会抛出异常
v1.swap(v2);//将v1和v2进行交换。容器的成员函数版本
swap(v1,v2);//同上。系统函数版本

assign(iter1,iter2);//将容器元素更换为一个迭代器的区间元素
assign(n,t);//将容器元素变为n个t元素
v.insert(iter,t);//在迭代器iter处插入t。返回所插位置处的迭代器
v.insert(v.end(),10,t);//在容器v的末尾插入10个元素,每个元素都是t。返回新添加元素的第一个元素的迭代器
v.insert(v.end(),{"a","b"...});//将后面花括号的每个元素插入容器v的尾部。返回新添加元素的第一个元素的迭代器
v.insert(v.begin(),v2.end()-2,v2.end());//将容器v2的最后两个元素插入容器v的头部。返回新添加元素的第一个元素的迭代器
注意:上面这个用法,后面两个参数不能为自身容器的范围(v.insert(v.begin(),v.end()-2,v.end());是错误的)

//利用insert的返回值,下面代码为一直在lst容器的头部插入元素(类似于push_front的功能)
vector<string> v;
auto iter=lst.begin();
while(cin>> word)
 iter=v.insert(iter,word);//insert函数每回执行完,返回容器的首元素位置
//vector不支持pop_front

v.push_back(t);//尾部追加元素t
v.pop_back();//删除尾元素

v.earse(iter);//删除迭代器iter所指位置处的元素。返回删除位置处后一个元素迭代器
v.erase(iter1,iter2);//删除迭代器iter1与iter2区间内的元素。返回删除最后一个元素的后一个元素迭代器

v.clear();//清空容器,重新初始化容器
v.resize(n);//将容器v的元素变为n个。若n<原始元素个数,删除多于元素。若n>原始元素个数,则用默认初始值初始化容器
v.resize(n,t);//将容器元素变为n个t。与容器原始个数无关

vector<int> v(5,666);
v.resize(3);//v内有3个元素,都是666
v.resize(8);;//v内有8个元素,前5个个是666,后3个都是0(默认)
v.resize(10,666);//v内有10个元素,都是666
//vector不支持emplace_front();
//下面的两个函数,是在内存中创建一个对象,然后添加进相应的位置
v.empalce(iter,args);//在容器v的位置添加创建一个args对象
v.emplace_back(args);//在容器v的尾部添加创建一个args对象

例如
class A{
 string name;int age;
public:
 A(string name, int age);
};
int main()
{
 vector<A> v;
 v.emplace_back("C语言", 18);//在尾部创建一个元素
 v.emplace(v.begin(),"C++",18);//在容器v的头部添加一个元素
}
v.capacity();//返回当前容器的容量(总共能存多少个)
v.reserve(n);//为容器v重新分配n个内存空间(如果n<=当前容器大小,则什么都不做)

六、容器操作使迭代器、引用、指针失效

1.概念:向容器中添加或者删除元素可能会使容器的迭代器、引用、指针失效。失效的迭代器、引用、指针不再表示任何元素,使用起来非常危险

2.添加元素

  • 如果vector没有内存重分配。插入位置之前的元素的迭代器、引用、指针有效,插入位置之后的迭代器、引用、指针都失效
  • 如果内存重分配,则所有的迭代器、引用、指针都失效

3.删除元素

删除元素之前的迭代器、引用、指针有效,之后的失效

七、vector是如何增长的

1.概念

vector是可变长的数组,当向其中增加元素时,如果空间已满,回自动申请一个新的空间,并将原来的空间释放,使指向原来空间的指针指向于新空间

2.方法:vector增长是有规律的,可以通过一个公式描述

  • maxSize=maxSize+((maxSize>>1)>1?(maxSize>>1):1)
  • 图解:就是由1、2、3、4、6、9...依次增长

到此这篇关于C++(STL库)之顺序容器vector的使用的文章就介绍到这了,更多相关C++ 顺序容器vector内容请搜素我们以前的文章或下面相关文章,希望大家以后多多支持我们!

(0)

相关推荐

  • C++ STL库应用汇总

    1.std::max_element的使用 std::min_element类似,求最小 #include <iostream> #include <iterator> #include <QApplication> bool myfn( int i, int j ) { return i < j; } int main( int argc, char* argv[] ) { QApplication a( argc, argv ); std::list<i

  • C++(STL库)之顺序容器vector的使用

    一.特点 ①总的来说:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 ②元素保存在连续的内存空间中,因此通过下标取值非常快 ③在容器中间位置添加或删除元素非常耗时 ④一旦内从重分配,和原vector相关的指针,引用,迭代器都失效.内存重分配耗时很长 二.头文件.using声明 头文件:#include <vector> using声明:using std::vector; 三.初始化 vector<T>  v1; ==>v1是一个空的vector ve

  • C++顺序容器(vector、deque、list)的使用详解

    目录 一:STL(Standard Template Library),即标准模板库,是一个高效的C++程序库 二:STL组件 三:容器 四:类型成员 五:迭代器 六:顺序容器 七:顺序容器--向量(vector) 八:顺序容器--双端队列--deque 九:顺序容器 --列表--list 一:STL(Standard Template Library),即标准模板库,是一个高效的C++程序库 1.从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,基

  • C++ 标准模板库 STL 顺序容器详解

    C++ 标准模板库 STL 顺序容器 容器 数据结构 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无序 可重复 双向迭代器 动态数组 vector ​ vector #include <vector> 动态数组:其元素在内存中是连续存放的,随机存取任何元素都可以在常数时间内完成,在该容器的尾部增删元素也几乎能够在常数时间内完成具有较好的性能. ​ 一个 vector 常用函数使用实例如

  • C++模拟实现STL容器vector的示例代码

    目录 一.vector迭代器失效问题 二.模拟实现构造函数调用不明确 1.问题描述 2.解决调用不明确的方法 三.reserve中的深浅拷贝问题 1.reserve中浅拷贝发生原因 2.浅拷贝发生的图解 3.解决方法 四.模拟实现vector整体代码 一.vector迭代器失效问题 1.Visual Studio和g++对迭代器失效问题的表现 int main(){ std::vector<int>v{1,2,3,4}; std::vector<int>::iterator it

  • C++Primer笔记之顺序容器的使用详解

    顺序容器,它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器.标准库里定义了三种类型:vector(支持快速随机访问).list(支持快速插入.删除).deque(双端队列)容器只定义了少量操作,大多数额外的操作由算法库提供.容器内元素的类型约束:1.元素类型必须支持赋值运算:2.元素类型的对象必须可以复制.这是容器元素类型的最低要求,如果想支持一些其他特殊要求,则必须具备相关的性质. 可以定义容器的容器vector< vector<int> > l

  • c++ vector(向量)使用方法详解(顺序访问vector的多种方式)

    vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器.vector 是C++ STL的一个重要成员,使用它时需要包含头文件: 复制代码 代码如下: #include<vector>; 一.vector 的初始化:可以有五种方式,举例说明如下: (1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的.(2)vector<int> a(10,

  • 深入解析C++ STL中的常用容器

    STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中的常用容器包括:顺序性容器(vector.deque.list).关联容器(map.set).容器适配器(queue.stac). 1.顺序性容器 (1)vectorvector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问.由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢

  • c++中STL库队列详细介绍

    1.queue单向队列(先进先出,只能从尾端加元素,从头删元素)         使用方式:在前面加上文件名'#include<queue>',再进行声明'queue<int>m;''其中'<>'里面是数组的类型,'m'是数组的名字.         操作: 1.q.push()//入队 2.q.pop()//让队首出队 3.q.front()//获得队首元素 4.q.back()//获得队尾元素         5.q.empty() 队列是否为空 6.q.size(

  • C++ primer超详细讲解顺序容器

    目录 顺序容器概述 容器库概览 迭代器 容器定义和初始化 赋值和swap 顺序容器操作 向顺序容器添加元素 访问元素 删除元素 特殊的forwa_list单向链表操作 改变容器大小 vector对象是如何增长的 定义:一个容器就是一个特定类型对象的集合. 顺序容器概述 (1)顺序容器类型 vector:可变数组大小,支持快速访问 deque:双端队列,支持快速随机访问,在头尾位置插入/删除速度很快 forward_list:单向链表,只支持单向顺序访问. array:固定大小数组,不能添加或删除

随机推荐