【C++】vector类概述

这篇具有很好参考价值的文章主要介绍了【C++】vector类概述。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、标准库中的vector

文档链接

1.1 vector的介绍

vector可以类比C语言的数组,他就像是一个可以动态增长的数组。
本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小,vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。

1.2 vector的常用接口

1.2.1 vector的常见构造

vector() 无参构造
vector(size_type n, const value_type& val = value_type()) 构造并初始化n个val
vector (const vector& x) 拷贝构造
vector (InputIterator first, InputIterator last) 使用迭代器进行初始化构造

int main()
{
	vector<int> v1;// 无参数构造
	vector<int> v2(5, 1);// 构造并初始化n个val
	vector<int> v3(v1);// 拷贝构造
	vector<int> v4(v1.begin(), v1.end());// 使用迭代器进行初始化构造
	return 0;
}

1.2.2 vector类对象的访问及遍历操作

begin +end 获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator
rbegin + rend 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的
reverse_iterator

operator[] 返回pos位置的数据

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	vector<int>::iterator it = v.begin();// 正向访问
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	vector<int>::reverse_iterator rit = v.rbegin();// 逆向访问
	while (rit != v.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
	for (int i = 0; i < v.size(); i++)// []访问
	{
		cout << v[i] << " ";
	}
	cout << endl;
	return 0;
}

1.2.3 vector类对象的容量操作

size 获取数据个数
capacity 获取容量大小
empty 判断是否为空
reserve 扩容
resize 扩容+初始化

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	cout << v.size() << endl;// 获取数据个数
	cout << v.capacity() << endl;// 获取容量大小
	cout << v.empty() << endl;// 判断是否为空
	v.reserve(10);// 扩容
	cout << "newsize:" << v.size() << endl;
	cout << "newcapacity:" << v.capacity() << endl;
	v.resize(10);// 扩容 + 初始化
	cout << "newsize:" << v.size() << endl;
	cout << "newcapacity:" << v.capacity() << endl;
	return 0;
}

结果:

4
4
0
newsize:4
newcapacity:10
newsize:10
newcapacity:10

1.2.4 vector类对象的修改操作

push_back 尾插
pop_back 尾删
assign 覆盖
find 查找(注意这个是算法模块实现,不是vector的成员接口)
sort 排序(注意这个是算法模块实现,不是vector的成员接口)
insert 在position之前插入val
erase 删除position位置的数据
swap 交换两个vector的数据空间

除了assign和find其他接口在string类的概述里面讲过,他们都大同小异。
【C++】string类概述

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.assign(4, 10);// 覆盖
	for (auto e : v)
	{
		cout << e << " ";
	}
	return 0;
}

vc vector<int>v(),C++,c++,面试,算法
使用find和sort前要先引入库函数:#include <algorithm>

int main()
{
	vector<int> v;
	v.push_back(5);
	v.push_back(4);
	v.push_back(3);
	v.push_back(2);
	v.push_back(7);
	v.push_back(1);
	v.push_back(6);
	vector<int>::iterator it = find(v.begin(), v.end(), 6);// 查找
	cout << *it << endl;
	sort(v.begin(), v.end());// 排序
	for (auto e : v)
	{
		cout << e << " ";
	}
	return 0;
}

vc vector<int>v(),C++,c++,面试,算法

二、迭代器失效问题

首先要知道迭代器的底层是指针,或者是对指针进行了封装,vector的原生态指针就是T*
而迭代器失效就是指针指向的空间被销毁了,如果继续使用,就会造成崩溃。

对于vector可能会导致其迭代器失效的操作有:
引起其底层空间容量改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等

例如:

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	v.reserve(10);
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	return 0;
}

vc vector<int>v(),C++,c++,面试,算法
迭代器失效解决办法:在使用前,对迭代器重新赋值即可。,后面的模拟实现会讲解。



纸上得来终觉浅,绝知此事要躬行。文章来源地址https://www.toymoban.com/news/detail-828184.html

到了这里,关于【C++】vector类概述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++算法——vector

            vector 是标准模板库的一个容器,直接翻译为“向量”,一般来成“可变长数组”,也即“长度会根据需要而变化的数组”。在竞赛中有些题目需要很大的很大的数组,而有些还用不上就需要用到 vector 。         使用 vector 首先要加#include vector,当然万能头也

    2023年04月24日
    浏览(48)
  • C++面试八股文:std::vector和std::list,如何选择?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第24面: 面试官: list 用过吗? 二师兄:嗯,用过。 面试官:请讲一下 list 的实现原理。 二师兄: std::list 被称为双向链表,和C中手写双向链表本质上没有大的区别。 list 对象中有两个指针,一个指向上一个节点( node ),一

    2024年02月10日
    浏览(39)
  • 创建了一个名为nums_list的vector容器,其中存储了一系列的pair<int, int>

    在上述代码中,我们首先创建了一个整数数组 nums ,其中包含了一些整数。然后,我们创建了一个空的 nums_list 容器。接下来,我们使用 for 循环遍历整数数组 nums ,并将每个数组元素和其对应的索引作为一个 pair 对象加入到 nums_list 容器中。最后,我们遍历 nums_list 容器,并

    2024年02月07日
    浏览(44)
  • 接缝雕刻算法的 C++ 实现 - 算法概述与基本原理

    接缝雕刻(Seam Carving)是一种用于图像大小调整的算法,其目标是在不扭曲图像的“重要”部分的情况下调整图像大小。这种算法的主要优点是,它可以保持图像的视觉完整性,同时改变图像的尺寸。这与传统的图像缩放方法(如双线性插值或最近邻插值)有很大的不同,因

    2024年02月13日
    浏览(30)
  • 如何将size_type强制转换成为int?Comparison of integers of different signs: ‘int‘ and ‘std::vector::size_type‘

    这是一个编译器的警告信息,意味着在比较两个不同类型的数据时,可能会导致一些问题。 具体来说,在mainwindow.cpp文件的第270行,有一个比较操作,将一个整数(int)和一个容器std::vectorQLabel *::size_type进行比较。容器的size_type类型是一个无符号整数(unsigned long),它的取值范围

    2024年02月15日
    浏览(50)
  • 【数据结构与算法】C++的STL模板(迭代器iterator、容器vector、队列queue、集合set、映射map)以及算法例题

    更多算法例题链接: 【数据结构与算法】递推法和递归法解题(递归递推算法典型例题) 什么是迭代器(iterator) 迭代器(iterator)的定义: 迭代器是一种检查容器内元素并遍历元素的数据类型。 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。 容器

    2024年04月14日
    浏览(50)
  • Visual C++(VC)6.0安装教程

    亲爱滴同学们 今天来安装VC 6.0 安装包可以直接去我的主页资源里下载安装包哦 或者私信我😎 Visual C++ 6.0,简称VC或者VC6.0,是微软的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C++是一个功能强大的可视化软件开发工具。 下面就是详细的安

    2024年02月14日
    浏览(42)
  • Microsoft Visual C++下载,VC++下载

    Microsoft Visual C++ 2019 v14.28.29617 Microsoft Visual C++ Redistributable(系统运行库,简称MSVC,VB/VC)是Windows操作系统应用程序的基础类型库组件。 Microsoft Visual C++运行库,Windows系统装机必备组件,这是官方版安装包。 Microsoft Visual C++ 2019为创建基于微软 Windows 和基于 Microsoft .NET 的应用

    2024年02月12日
    浏览(86)
  • 【自学C++】C++ int

    C++ 中的 int 用来表示一个 整数 ,也可以叫做整型,int 的取值范围是介于 short 和 long 之间的。 语法 参数 参数 描述 int 定义 int 类型变量使用的类型。 varname 变量名。 value 可选,变量的初始值,该值不可以超过 int 类型的最大值。 说明 使用 int 定义了一个 int 类型的变量 va

    2024年02月14日
    浏览(28)
  • Microsoft微软官方Win10 visual c++(vc++2019)运行库下载

    最新支持Visual C++ 可再发行程序包下载 | Microsoft Docs 本文列出了最新版本的包的下载Visual C++ 可再发行程序包链接。 https://support.microsoft.com/zh-cn/help/2977003/the-latest-supported-visual-c-downloads 安装后可以解决某些软件(如QQ)运行时 .dll 文件报错问题

    2024年02月16日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包