C++的vector类(一):vector类的常见操作

目录

前言

Vector类

遍历与初始化vector

​vector的扩容机制

vector的对象操作

find与insert

对象数组


前言

string类中还有一些内容需要注意:

STL 的string类怎么啦?

C++面试中string类的一种正确写法

C++ STL string的Copy-On-Write技术

C++的std::string的“读时也拷贝”技术!

Vector类

vector文档:cplusplus.com/reference/vector/vector/

基本概念:vector是表示可变数组(针对int、double等,字符数组去用string)的序列容器

类原型:template <class T,class Alloc = allocator<T> >class vector

class Alloc = allocator<T>(内存池)采用系统提供的默认的就行 

注意事项:[]、普通数组和at的区别在于[]利用断言检查不给改错机会,普通数组是抽查的给改错机会,at是异常捕获

以下几个表中的内容与string类中的内容相似,不再一一演示 

vector的定义

(constructor)构造函数声明

接口说明
vector() (重点)
无参构造
vector(size_type n, const value_type& val = value_type())
构造并初始化n个val
vector (const vector& x); (重点)
拷贝构造
vector (InputIterator first, InputIterator last)
使用迭代器进行初始化构造
vector iterator的使用
iterator的使用接口说明

begin +

end

获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置 的iterator/const_iterator

rbegin +

rend

获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的 reverse_iterator
vector的增删改查
vector的增删改查接口说明

assign

覆盖

push_back

尾插

pop_back

尾删
find查找(不是vector的成员接口,使用时要包含algorithm头文件)

insert

在指定位置前插入数据

erase

删除指定位置数据

swap

交换两个vector的数据空间

clear

清空数据

operator[]

像数组一样访问

遍历与初始化vector

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	//初始化
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

    //vector<int>(10,1):开始个空间每个空间给个1

	//[]重载
	for (size_t i = 0; i < v.size(); i++)
	{
		cout << v[i] << "";
	}
	cout << endl;

	//迭代器
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	//范围for
	for (auto i : v)
	{
		cout << i << " ";
	}
		cout << endl;
	return  0;
}

​vector的扩容机制

1、扩容1.5倍然后取整

#include <iostream>
#include <vector>
using namespace std;

void test_vector2()
{
	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 change:" << sz << endl;
		}
	}
}

int main()
{
	test_vector2();
	return  0;
}

2、resize和reserve不会缩容,要缩容用shrink_to_fit

#include <iostream>
#include <vector>
using namespace std;

void test_vector2()
{
	size_t sz;
	vector<int> v;
	sz = v.capacity();
	v.reserve(100);//提前开空间
	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 change:" << sz << endl;
		}
	}
	cout << "-----------------------" << endl;

	cout << "reserve尝试对原空间进行缩容 >" << endl;
	cout <<"原size >" << v.size() << endl;
	cout <<"原capacity >" << v.capacity() << endl;

	v.reserve(10);

	cout << "后size >" << v.size() << endl;
	cout << "后capacity >" << v.capacity() << endl;

	cout << "-----------------------" << endl;

	cout << "resize尝试对原空间进行缩容 >" << endl;
	cout << "原size >" << v.size() << endl;
	cout << "原capacity >" << v.capacity() << endl;

	v.resize(10);

	cout << "后size >" << v.size() << endl;
	cout << "后capacity >" << v.capacity() << endl;

	cout << "-----------------------" << endl;

	cout << "原size >" << v.size() << endl;
	cout << "原capacity >" << v.capacity() << endl;
	cout << "shrink_to_fit尝试对原空间进行缩容 >" << endl;

	v.shrink_to_fit();

	cout << "后size >" << v.size() << endl;
	cout << "后capacity >" << v.capacity() << endl;

}

int main()
{
	test_vector2();
	return  0;
}

vector的对象操作

find与insert

#include <iostream>
#include <vector>
#include<string>
#include <algorithm>
using namespace std;

//增删改查
void test_vector3()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

	cout << "初始化 >";
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;


	//找到数组中的3并返回该数据的下标
	auto pos = find(v.begin(), v.end(), 3);
	if (pos != v.end())//左闭右开才能遍历到数组所有的值
	{
		v.insert(pos,30);//在pos位置前插入30
	}
	cout << "在3前插入30后 >";
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	//头插
	v.insert(v.begin(), 0);
	cout << "头插0 >";
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	//在下标为2的位置插入
	v.insert(v.begin() + 2, 20);
	cout << "在下标为2的位置插入20 >";
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	string s("abcd");
	cout << "头插字符串 >";
	v.insert(v.begin(), s.begin(), s.end());
	for (auto e : v)//读取ASCII码
	{
		cout << e << " ";
	}
	cout << endl;

}

int main()
{
	test_vector3();
	return  0;
}

对象数组

push_back的原型:void push_back(const value_type& val)

  • value_type:自适应类型
#include <iostream>
#include <vector>
#include<string>
#include <algorithm>
using namespace std;

//对象数组
void test_vector4()
{
	//对象数组
	vector<string> v;
	//版本一:有名对象
	string s1("苹果");
	v.push_back(s1);

	//版本二:匿名对象
	v.push_back(string("香蕉"));

	//版本三:隐式类型转换->产生临时对象->将该临时对象传入->val就是string类型对象的引用
	//隐式类型转换:字符串->字符数组->调用std::string(const char*)构造临时std::string对象,并将该对象传递给函数
	v.push_back("草莓");//版本一二三效果相同

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

}

int main()
{
	test_vector4();
	return  0;
}

        在 Visual Studio 中使用 std::string,通常情况下,当字符串长度小于等于 28 字节时,std::string 对象会将字符串内容存储在对象内部的小缓冲区中。这个小缓冲区被称为 "短字符串优化"。这样可以避免频繁地进行堆分配和释放。对于超过 28 字节的较长字符串,则会动态分配内存来存储其内容,且 std::string 对象本身仅保存指向堆上数据的指针。

        如果有一个包含多个较长字符串的对象数组,并且只关心它们是一个对象数组而不需要了解每个具体元素所在位置或大小细节,那么您可以声明一个 std::vector<std::string> 来存储这些字符串。无论单个 std::string 的大小如何,在该向量中每个元素都将是一个完整的 std:string 对象。

vector是一个数组模板,除了有对象数组,还可以有链表数组、树数组、以及嵌套vector数组:

树数组:vector<tree> tc
链表数组:vector<list> lc
嵌套vector数组:vector<vector<int>> cc

  • 外部vector的T是vector<int>*,内部vector的T是int*
  • vector<int>*可以指向多个vector<int>,int*可以指向多个int
  • 外部vector实例化出了对象数组,内部vector实例化出了整型数组

~over~

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

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

相关文章

网络编程 - 套接字

1、预备知识 1.1、理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址&#xff1b; 思考: 我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上, 但是还需要有一个其他的标识来区分…

kafka面试篇

消息队列的作用&#xff1a;异步、削峰填谷、解耦 高可用&#xff0c;几乎所有相关的开源软件都支持&#xff0c;满足大多数的应用场景&#xff0c;尤其是大数据和流计算领域&#xff0c; kafka高效&#xff0c;可伸缩&#xff0c;消息持久化。支持分区、副本和容错。 对批处理…

使用ansible剧本进行lvm分盘

使用 Ansible 剧本&#xff08;Playbook&#xff09;进行 LVM 分区管理是一种自动化的方式&#xff0c;可以帮助管理员在多台主机上批量管理逻辑卷。 部署环境 3台主机&#xff0c;添加硬盘 ansible-galaxy collection install community.general 联网执行&#xff0c;下…

蓝桥杯算法心得——游戏(优先队列)

大家好&#xff0c;我是晴天学长&#xff0c;优先队列的题&#xff0c;式子化简非常重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .游戏 2) .算法思路 附近最小 1.接收数据 2.找出最小的&#…

docker 配置国内阿里镜像源

在/etc/docker/目录下新建daemon.json文件 在文件中写入 {"registry-mirrors": ["https://jmphwhtw.mirror.aliyuncs.com"] } 以管理员身份运行命令 systemctl daemon-reload systemctl restart docker

羊大师羊奶靠谱么?消费口碑深度讲解

羊大师羊奶靠谱么&#xff1f;消费口碑深度讲解 羊大师羊奶&#xff0c;作为羊奶市场的一颗璀璨明星&#xff0c;其靠谱性一直备受广大消费者的关注。那么&#xff0c;羊大师羊奶究竟靠不靠谱呢&#xff1f;这需要我们从品牌实力与消费口碑两个方面进行深度解析。 从品牌实力来…

小米相册提取表格选项消失解决方法

小米相册这次的提取表格选项消失 故障原因&#xff1a; 因为部分用户将小爱视觉&#xff08;原名扫一扫&#xff09;这个应用给卸载了导致 解决方法 应用商店下载 小爱视觉 安装后授权即可使用 注意&#xff1a;系统最好为最新的 Xiaomi HyperOS系统

PFXA401SF Millmate控制器400设计用于提供大量功能 Brown Boveri BBC

PFXA401 Millmate控制器400设计用于提供大量功能&#xff0c;同时具有高度的用户友好性。 控制单元涵盖了所有边缘传感器的安装可能性。这意味着用户只需按照逐步说明设置控制单元&#xff0c;并计算正确的料带边缘和中心位置及宽度。 计算相对于轧机的真实带材位置和宽度 过滤…

RabbitMQ在Java中使用 SpringBoot 从基础到高级

充分利用每一个监听者 需要充分利用每一个消费者&#xff0c;需要在配置文件中加上prefetch配置并设置为1 rabbitmq:listener:simple:prefetch: 1 # 每次只能获取一条消息&#xff0c;处理完成才能获取下一个消息创建交换机和队列 创建队列 "fanout.queue1"&…

云农场种植、领养、收获,认养模式新浪潮

​ 小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 在…

服务器中了mallox勒索病毒还能恢复数据吗?

什么是mallox勒索病毒&#xff1f; mallox是一种最近多发的勒索病毒类型&#xff0c;它主要针对企业的Web应用和数据库服务器进行攻击。mallox后缀的勒索病毒会加密用户的重要文件数据并以此为要挟索要赎金。该类病毒会绕过企业的防火墙和各种防护软件&#xff0c;对目标设备进…

Python 将HTML转为PDF、图片、XML、XPS格式

网页内容是信息传播的主要形式之一。在Web开发中&#xff0c;有时候我们需要将HTML文件以不同的格式保存或分享&#xff0c;比如PDF、图片&#xff08;如PNG或JPEG&#xff09;、XML或XPS等。这些格式各有优势&#xff0c;适合不同的用途。在这篇文章中&#xff0c;我们将介绍如…

GPU 使用率监测及可视化

1. 使用 nvidia-smi可视化 直接在终端输入nvidia-smi动态查看GPU的使用情况watch -n 0.5 nvidia-smi其中0.5表示每隔0.5秒更新一次,时间可以调整 2. 使用nvitop可视化 2.1 nvitop的使用 (1) 安装 pip install nvitop(2) 查看GPU使用率 nvitop

【LAMMPS学习】三、构建LAMMPS(11)开发构建选项

3. 构建 LAMMPS 3.11.开发构建选项 LAMMPS 中的构建过程提供了一些在开发、测试或调试期间有用的额外选项。 3.11.1.监视编译标志&#xff08;仅限 CMake&#xff09; 有时需要验证 CMake 构建生成的编译标志的完整序列。要在编译期间启用更详细的输出&#xff0c;可以使用…

DenseNet《Densely Connected Convolutional Networks》

DenseNet学习笔记 摘要引言DenseNetsResNetsDense connectivityResNet 和 DenseNet 的对比DenseBlock 向前传播的过程Composite functionPooling layersGrowth rateBottleneck layersCompression 压缩实现细节 实验训练 代码复现 摘要 最近的研究表明&#xff0c;如果卷积网络…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(自定义组件的生命周期)

自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期&#xff0c;这些回调函数是私有的&#xff0c;在运行时由开发框架在特定的时间进行调用&#xff0c;不能从应用程序中手动调用这些回调函数。 说明&#xff1a; 本模块首批接口从API version 7开始支持&#x…

c语言(动态内存管理函数)

1. 为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有&#xff1a; int arr[10] {0}; char a; 但是上述的开辟空间的⽅式有两个特点&#xff1a; 但是上述的开辟空间的⽅式有两个特点&#xff1a; • 空间开辟⼤⼩是固定的。 • 数组在申明的时候&#xff0c;必须指…

php 对接Mintegral汇量海外广告平台收益接口Reporting API

今天对接的是Mintegral广告reporting api接口&#xff0c;拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Mintegral后台就能看到文档地址以及参数&#xff1a; 文档地址&#xff1a;https://cdn-adn-https.rayjump.com/cdn-adn/reporting_api/MintegralRA.…

Java基于微信小程序的二手交易系统的实现(V2.0)

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、Python 技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#…

C++初阶:string类相关练习题

目录 1. 字符串相加2. 反转字母3. 字符串中唯一字母4. 字符串中最后一个单词5. 验证回文串6. 反转字符II7. 反转字符串中的单词8. 字符串相乘 1. 字符串相加 题目信息&#xff1a; 题目连接&#xff1a; 字符串相加 class Solution { public:string addStrings(string num1, s…