C++入门---vector常用函数介绍及使用

文章目录

  • vector的介绍
  • vector的使用
    • vector拷贝构造函数
    • vector迭代器
    • vector 空间增长
      • vector的size、capacity、empty函数
      • vector的resize函数
      • vector的reserve函数
    • vector增删查改
      • vector的push_back、pop_back函数
      • vector的operator[]函数
      • vector的insert、erase函数
      • vector与算法关联
  • 总结

vector的介绍

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

vector的使用

vector拷贝构造函数

函数名称为:

//vector使用了类模板,需要使用显示实例化
template < class T, class Alloc = allocator<T> > class vector; 
vector();//无参构造
vector(size_type n, const value_type& val = value_type());//构造并初始化n个val
vector (const vector& x); //使用拷贝构造
vector (InputIterator first, InputIterator last);//使用迭代区间进行初始化构造

eg1:

void Testvector1()
{
	//无参构造
	vector<int> v1;
	//使用n个val进行初始化
	vector<int> v2(5, 1);
	//拷贝构造
	vector<int> v3(v2);
	//使用迭代区间进行初始化
	vector<int> v4(v3.begin(), v3.end());
}

代码调试的结果为:
在这里插入图片描述

vector迭代器

//正向迭代器
//可读写
iterator begin();//获取第一个数据位置的iterator
iterator end(); //获取最后一个数据的下一个位置iterator
的iterator
//只读不写
const_iterator begin() const;
const_iterator end() const;
//反向迭代器
//可读写
reverse_iterator rbegin();//获取最后一个数据位置的reverse_iterator
reverse_iterator rend();获取第一个数据前一个位置的
reverse_iterator
//只读不写
const_reverse_iterator rbegin() const;      
const_reverse_iterator rend() const;

eg:

void Testvector2()
{
	vector<int> v(5, 1);
	vector<int>::iterator it = v.begin();
	//读取
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	//修改
	it = v.begin();
	while (it != v.end())
	{
		(*it)++;
		it++;
	}
	//修改后读取
	it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

代码运行的结果为:
在这里插入图片描述
vector迭代器为左闭右开区间:
在这里插入图片描述

vector 空间增长

vector的size、capacity、empty函数

函数名称为:

size_type size() const;//获取数据个数
size_type capacity() const;//获取容量大小
bool empty() const;//判断vector是否为空

eg1:

void Test2()
{
	vector<int> v(6, 1);
	printf("vector数据个数为:%d\n", v.size());
	printf("vector的存储容量为:%d\n", v.capacity());
	printf("vector是否为空判断:%d\n", v.empty());
}

代码运行的结果为:
在这里插入图片描述
eg2:

// 测试vector的默认扩容机制
void TestVectorExpand()
{
	size_t sz;
	vector<int> v;
	sz = v.capacity();
	cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}

代码运行的结果为:
在这里插入图片描述

vector的resize函数

函数名称为:

void resize (size_type n, value_type val = value_type());//改变vector的

eg:

void Test3()
{
	vector<int> v;
	v.resize(10, 1);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

代码运行结果为:
在这里插入图片描述

vector的reserve函数

函数名称为:

//大小
void reserve (size_type n);//改变vector的capacity

eg:

// 如果已经确定vector中要存储元素大概个数,可以提前将空间设置足够
// 就可以避免边插入边扩容导致效率低下的问题了
void TestVectorExpandOP()
{
	vector<int> v;
	size_t sz = v.capacity();
	v.reserve(100); // 提前将容量设置好,可以避免一遍插入一遍扩容
	cout << "making bar grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}

代码运行结果为:
在这里插入图片描述

  • capacity的代码在vsg++下分别运行会发现,vscapacity是按1.5倍增长的g++是按2倍增长的。vector增容都是2倍,具体增长多少是根据具体的需求定义的。vsPJ版本STLg++SGI版本STL
  • reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题,从而提高效率!
  • resize在开空间的同时还会进行初始化,影响size

vector增删查改

vector的push_back、pop_back函数

函数名称为:

void push_back (const value_type& val);//尾插
void pop_back();//尾删

eg:

void Test4()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	printf("尾插后的结果为:>");
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	v.pop_back();
	v.pop_back();
	printf("尾删后的结果为:>");
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

代码运行结果为:
在这里插入图片描述

vector的operator[]函数

函数名称为:

//像数组一样访问
reference operator[] (size_type n);//可以读写
const_reference operator[] (size_type n) const;//只读不写

eg:

void Test5()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}

代码运行结果为:
在这里插入图片描述

vector的insert、erase函数

函数名称为:

//在pos位置插入val
iterator insert (iterator pos, const value_type& val);
iterator erase (iterator pos);

eg:

void Test6()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	v.insert(v.begin(), 6);
	printf("使用insert头插后:\n");
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	v.erase(v.begin() + 2);
	printf("使用erase删除后:\n");
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

代码运行的结果为:
在这里插入图片描述

vector与算法关联

vector与算法的find函数结合使用:
函数名称为:

//aglorithm的find函数
template <class InputIterator, class T>
   InputIterator find (InputIterator first, InputIterator last, const T& val);
void Test7()
{
	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 pos = find(v.begin(), v.end(), 3);
	printf("查找的结果:%d\n", *pos);
}

代码运行的结果为:
在这里插入图片描述
vector与算法的sort函数结合使用:
函数名称为:

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
//使用类模板,编译器会自动识别类模板,comp不写默认sort排序为升序

eg:

void Test8()
{
	int a[] = { 16,2,77,29,3,33,43,3,2,3,3,2 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));
	printf("排序前的结果为:\n");
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	printf("排升序的结果为:\n");
	sort(v.begin(), v.end(), less<int>());
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	printf("排降序的结果为:\n");
	sort(v.begin(), v.end(), greater<int>());
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

代码运行的结果为:
在这里插入图片描述

容器和算法通过迭代器配合进行使用。

总结

了解了string类vector常用函数后,能不能使用vector<char>代替string类呢?

不能,①string类vector<int>的主要区别是末尾是否有'\0'vector的查改的情况需要自己考虑‘\0’的情况②string的接口可以插入一个字符串,或者一个string类对象,string类接口函数多,功能齐全。所以不能使用vector<int>代替string类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/87660.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MQ消息队列(主要介绍RabbitMQ)

消息队列概念&#xff1a;是在消息的传输过程中保存消息的容器。 作用&#xff1a;异步处理、应用解耦、流量控制..... RabbitMQ&#xff1a; SpringBoot继承RabbitMQ步骤&#xff1a; 1.加入依赖 <dependency><groupId>org.springframework.boot</groupId&g…

Springboot 项目配置Swagger2

1. 加入swagger 依赖 springboot 项目的 pom.xml 中添加下列依赖&#xff1a; <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency> <depe…

C语言入门 Day_9 条件判断

目录 前言&#xff1a; 1.if判断 2.else判断 3.易错点 4.思维导图 前言&#xff1a; 我们知道比较运算和逻辑运算都会得到一个布尔型的数据&#xff0c;要么为真&#xff08;true&#xff09;&#xff0c;要么为假&#xff08;false&#xff09;。 今天我们来学习真和假在…

综合能源系统(8)——综合能源系统支撑技术

综合能源系统关键技术与典型案例  何泽家&#xff0c;李德智主编 1、大数据技术 1.1、大数据技术概述 大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高…

Firefox(火狐),使用技巧汇总,问题处理

本文目的 说明火狐如何安装在C盘之外的盘&#xff0c;即定制安装路径。如何将同步功能切换到本地服务上。默认是国际服务器。安装在C盘之后如何解决&#xff0c;之前安装的扩展无法自动同步的问题。顺带讲解一下&#xff0c;火狐的一些比较好用的扩展。 安装路径定制 火狐目前…

Java IO流(五)Netty实战[TCP|Http|心跳检测|Websocket]

Netty入门代码示例(基于TCP服务) Server端 package com.bierce.io.netty.simple; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGro…

宝塔 杀死 java服务 netstat -tlnp | grep :7003 kill 2205698

7003 是端口 netstat -tlnp | grep :7003 kill 2205698

企业电子招投标采购系统源码之电子招投标的组成 tbms

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为…

七夕特辑(一)浪漫表白方式 用神经网络生成一首情诗

目录 一、准备工作二、用神经网络生成一首诗&#xff0c;代码说明 牛郎织女相会&#xff0c;七夕祝福要送来。祝福天下有情人&#xff0c;终成眷属永相伴。 七夕是中国传统的情人节&#xff0c;也是恋人们表达爱意的好时机。在这个特别的日子里&#xff0c;送上温馨的祝福&…

STM32电源名词解释

STM32电源架构 常用名词 VCC Ccircuit 表示电路&#xff0c;即接入电路的电压。 VDD Ddevice 表示器件&#xff0c; 即器件内部的工作电压。 VSS Sseries 表示公共连接&#xff0c;通常指电路公共接地端电压。 VDDA Aanalog 表示模拟&#xff0c;是模拟电路部分的电源。主要为…

Java“牵手”天猫商品列表数据,关键词搜索天猫商品数据接口,天猫API申请指南

天猫商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取天猫商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问天猫商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…

21. 合并两个有序链表(简单系列)

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[] 示例 3&#xff1a; …

jstat(JVM Statistics Monitoring Tool):虚拟机统计信息监视工具

jstat&#xff08;JVM Statistics Monitoring Tool&#xff09;&#xff1a;虚拟机统计信息监视工具 用于监视虚拟机各种运行状态信息的命令行工具。 它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据&#xff0c;在没有GUI图形界面、只提…

C语言暑假刷题冲刺篇——day4

目录 一、选择题 二、编程题 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C语言每日一练 ✨其他专栏&#xff1a;代码小游戏C语言初阶&#x1f91d;希望作者的文章能对你…

MySQL MVCC的详解之Read View

文章目录 概要一、基于UNDO LOG的版本链1.1、行记录结构1.2、了解UNDO LOG1.3、版本链 二、Read View2.1、判定机制 三、参考 概要 在上文中&#xff0c;我们提到了MVCC&#xff08;Multi-Version Concurrency Control)多版本并发控制&#xff0c;是通过undo log来实现的。那具…

如何在 Opera 中启用DNS over HTTPS

DNS over HTTPS&#xff08;基于HTTPS的DNS&#xff09;是一种更安全的浏览方式&#xff0c;但大多数 Web 浏览器默认情况下不启用它。了解如何在 Opera 浏览器中启用该功能。 您可能不知道这一点&#xff0c;但您的网络浏览器并不像您希望的那样私密或安全。您会看到&#xff…

Python Opencv实践 - 图像直方图均衡化

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像直方图计算 #cv.calcHist(images, channels, mask, histSize, ranges, hist, accumulate) #images&…

数据结构(6)

2-3查找树 2-结点&#xff1a;含有一个键(及其对应的值)和两条链&#xff0c;左链接指向2-3树中的键都小于该结点&#xff0c;右链接指向的2-3树中的键都大于该结点。 3-结点&#xff1a;含有两个键(及其对应的值)和三条链&#xff0c;左链接指向的2-3树中的键都小于该结点&a…

FPGA原理与结构——FIFO IP核原理学习

一、FIFO概述 1、FIFO的定义 FIFO是英文First-In-First-Out的缩写&#xff0c;是一种先入先出的数据缓冲器&#xff0c;与一般的存储器的区别在于没有地址线&#xff0c; 使用起来简单&#xff0c;缺点是只能顺序读写数据&#xff0c;其数据地址由内部读写指针自动加1完成&…

vscode 无法跳转第三方安装包

vscode 无法跳转第三方安装包 场景&#xff1a;使用vscode写代码时&#xff0c; 第三方的安装包无法使用ctrl 左键&#xff0c;点击进入查看&#xff0c; 不方便源码查看 解决办法&#xff1a; 使用快捷键 Ctrl Shift P&#xff0c; 进入命令搜索框搜索 setting.json 编辑…
最新文章