【C++】一文带你走入vector

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


ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)ノ"
【C++】一文带你走入vector,C++,笔记,c++,开发语言


一、vector的介绍

vector文档介绍 大部分的使用与string的使用类似
vector类似于顺序表,是动态增长的数组。头文件:#include < vector >

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(deque, list and forward_list),vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好

二、vector的常用接口说明

2.1 vector的使用

【C++】一文带你走入vector,C++,笔记,c++,开发语言
vector可以存储任意类型的数据
代码展示:

	vector<int> v1;//可以是int类型,也可以是任意类型
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);

	vector<string> v2;//可以是string类型
	v2.push_back("易烊千玺");
	v2.push_back("王俊凯");
	v2.push_back("王源");

	vector<int> v3;
	v3 = v1;

	vector<double> v4(10, 1.2);//10个1.2进行初始化
	//可以迭代器区间进行初始化
	vector<string> v5(++v2.begin(), v2.end());
	//从v2的第二个到最后一个,对v5进行初始化

	string s = "hello world";
	vector<char> v6(s.begin(), s.end());
	//可以是任意类型的迭代器,不一定是自已类型的迭代器

注意:allocator是空间配置器,其实就是内存池。空间配置器也可以自己写。
【C++】一文带你走入vector,C++,笔记,c++,开发语言

2.2 vector iterator的使用

【C++】一文带你走入vector,C++,笔记,c++,开发语言

vector的遍历

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	//vector的遍历
	//1.[]
	for (size_t i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	//2.迭代器
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//3.范围for
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

2.3 vector空间增长问题

【C++】一文带你走入vector,C++,笔记,c++,开发语言
max_size()
【C++】一文带你走入vector,C++,笔记,c++,开发语言

  • capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
  • reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
  • resize在开空间的同时还会进行初始化,影响size。(开空间+初始化可以用resize()
  • string 和 vector 删除数据时,是不会缩容的(capacity)

单次增容越多,增容次数越少,效率就越高,但是可能浪费空间越多。(如果知道要开多少空间可以用reverve())

shrink_to_fit
【C++】一文带你走入vector,C++,笔记,c++,开发语言
shink_to_fit会把容量变得和size一样,但是这个函数需要慎用,因为空间不是一部分还给操作系统,而是把所有空间都还给操作系统,重新开辟一块空间把数据放入。

2.4 vector 增删查改

【C++】一文带你走入vector,C++,笔记,c++,开发语言
insert
【C++】一文带你走入vector,C++,笔记,c++,开发语言
vector是不支持下标插入的,只支持迭代器;string是支持下标插入的。
vector是没有头插的,可以用insert进行头插。insert也支持尾插。【超过尾插就不可以了,就会越界访问,编译出现错误】

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.insert(v.begin(), -1);//相当于头插
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	v.insert(v.begin() + 5, 20);//相当于尾插
	//v.insert(v.begin() + 7, 30);//这行代码,会报错
	//此时一共有6个数据,如果在第8个位置插入是不可以的,不可以越界
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

【C++】一文带你走入vector,C++,笔记,c++,开发语言
erase
【C++】一文带你走入vector,C++,笔记,c++,开发语言
注意:这里也是迭代器【注意:不能越界】

查找
vector和list都没有查找函数,复用的是算法里面的find()函数
【C++】一文带你走入vector,C++,笔记,c++,开发语言

find()函数支持一段迭代器区间找一个值,没有找到返回last.[所以,是一个前闭后开区间];头文件是#include < algorithm > 算法

删除3->先找3这个位置->删除
代码展示:

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	//查找
	vector<int>::iterator pos = find(v.begin(), v.end(),3);
	//auto pos = find(v.begin(), v.end(), 3);//这一种比较方便
	if (pos != v.end())
	{
		cout << "找到了" << endl;
		v.erase(pos);
	}
	else
	{
		cout << "没有找到" << endl;
	}
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

【C++】一文带你走入vector,C++,笔记,c++,开发语言
sort
【C++】一文带你走入vector,C++,笔记,c++,开发语言

  • sort对vector可以进行排序,对其他容器也可以进行排序,但是有的并不适合(list)
  • sort默认是升序排序,如果想要降序,就需要仿函数【头文件#include < functional >】
    代码展示
	vector<int> v;
	v.push_back(1);
	v.push_back(0);
	v.push_back(5);
	v.push_back(8);
	v.push_back(4);

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	//默认升序
	sort(v.begin(), v.end());
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	//仿函数,降序
	sort(v.begin(), v.end(), greater<int>());
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

【C++】一文带你走入vector,C++,笔记,c++,开发语言


三、总结

以上就是今天要讲的内容,本文详细的介绍了vector的使用,vector iterator的使用,vector空间增长问题,vector增删查改。希望给友友们带来帮助!文章来源地址https://www.toymoban.com/news/detail-713448.html

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

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

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

相关文章

  • 【C++学习手札】一文带你初识C++继承

                                                                                      食用指南:本文在有C基础的情况下食用更佳                                           🍀 本文前置知识:  C++类                           

    2024年02月12日
    浏览(87)
  • 【C++学习手札】一文带你认识C++虚继承​​

                                            食用指南:本文在有C++基础的情况下食用更佳                                           🍀 本文前置知识:C++虚函数(很重要,内部剖析)                                        ♈️ 今日夜电波 : 僕

    2024年02月12日
    浏览(88)
  • go语言入门-一文带你掌握go语言函数

    本文go语言入门-掌握go语言函数收录于《go语言学习专栏》专栏,此专栏带你从零开始学习go语言。 在每一种编程语言中都有函数的概念,函数是基本的代码快,用于执行一个任务。 我们之前写的函数代码中,都包含一个main函数: 这个 main 就是一个函数的定义,包含了以下几

    2024年02月03日
    浏览(43)
  • 一文带你玩转C语言文件操作

    作者主页:  paper jie的博客_CSDN博客 本文作者: 大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于 《系统解析C语言》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将算法基础知识一网打尽,希望可以帮到读者们哦

    2024年02月17日
    浏览(62)
  • 【C++ • STL】一文带你走进string

    ヾ(๑╹◡╹)ノ\\\" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ\\\" STL (standard template libaray- 标准模板库 ):是C++标准库的 重要组成部分 ,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 STL六大组件 开源的:linux、git、STL、mysql、安卓……【开源会发

    2024年02月09日
    浏览(48)
  • 一文带你掌握C语言的循环结构

    在C语言中,循环结构是一种重要的控制结构,它允许我们重复执行一段代码,以达到特定的目的。循环结构可以帮助我们简化重复性的任务,提高代码的效率。本篇文章将深入探讨C语言中的循环结构,包括 while 循环、for 循环、do-while 循环以及循环中的控制语句。 while 循环

    2024年02月05日
    浏览(62)
  • 一文带你掌握C语言的分支结构

    在本篇博客文章中,我们将深入探讨C语言中的if语句及其相关用法。if语句是一种用于条件判断的分支语句,它允许我们根据条件的真假来执行不同的代码块。 if语句的基本语法如下所示: 在这个语法结构中,条件是一个布尔表达式,如果条件的值为真(非零),则执行if语

    2024年02月05日
    浏览(55)
  • 一文带你学透MySQL核心——DQL语言

      本期的主要内容是关于SQL语句中的 核心语句 ,我们在生活中使用最多的查询语句DQL语句。 前言 DQL 数据库查询语言  1.介绍 2. 基本查询 2.1 查询多个字段 2.2 查询所有字段 2.3 设置别名 2.4 去除重复记录   2.5 基本查询练习案例  3. 条件查询 where 3.1 语句格式 3.2 条件运算符

    2024年02月08日
    浏览(45)
  • 【C++杂货铺】一文带你走进RBTree

    红黑树是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是 Red 或 Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,这句话换个意思就是:红黑树中最长路径不超过最短路径的 2 倍

    2024年02月08日
    浏览(55)
  • 不知道该学那一个语言?一文带你了解三门语言

    名字:阿玥的小东东 学习:Python。正在学习c++ 主页:阿玥的小东东 目录 粉丝留言,回答问题 1.首先,初步了解 

    2024年02月21日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包