当前位置: 首页 > article >正文

C++初阶学习第八弹--深入解析vector的使用

C++初阶学习第七弹——string的模拟实现-CSDN博客

C++初阶学习第六弹------标准库中的string类_c# string[]-CSDN博客

目录

一.vector的基本概念

二、vector的使用

2.1.vector iterator 的使用

2.2vector的空间增长问题

2.3 vector的增删查改


一.vector的基本概念

vector是表示可变大小数组的序列容器 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。

 一般有以下几种特点:可动态增长,可动态缩小,支持随机访问,支持插入和删除。

 vector是一个模板类,定义在头文件(include<vector>)中。可以使用vector来存储任意类型的对象,包括自定义类型。

二、vector的使用

vector由于是一个容器,它支持不同类型的数据进行操作,所以这个写法上与string还是有不少区别,如vector在定义一个变量时的方式为:

vector<int> v1;
vector<double> v2;
vector<string> v3;

#include<iostream>
#include<vector>
using namespace std;
 
// 1、测试vector的几种构造方法
void test1_vector()
{
	vector<int>();    //这种的会发生隐式类型转换,但只在本行起作用
	vector<int> v1;   //无参构造
	vector<int> v2(10, 100);   //构造一个vector有10个100
	vector<int> v3(v2);    //拷贝构造
	vector<int> v4(v2.begin(), v2.end());   //迭代器构造
	//下面还有一种迭代器构造的方式,这里涉及了迭代器的初始化,我们在下面会讲
	int arr[] = { 22,33,44,55 };
	vector<int> v5(arr, arr + sizeof(arr) / sizeof(int));
 
	cout << "The contents of v5 are:";
	for (vector<int>::iterator it = v5.begin(); it != v5.end(); ++it)
		cout << ' ' << *it;
	cout << '\n';
}
int main()
{
	test1_vector();
	return 0;
}

 

2.1.vector iterator 的使用

void test2_vector()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	//正向迭代器1
	vector<int>::iterator it = v1.begin();
	while (it != v1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//正向迭代器2
	for (auto e : v1)     //for循环的本质其实就是迭代器,而且它还会自己++
	{
		cout << e << " ";
	}
	cout << endl;
	//反向迭代器
	vector<int>::reverse_iterator rt = v1.rbegin();
	while (rt != v1.rend())
	{
		cout << *rt << " ";
		rt++;
	}
	cout << endl;
}

2.2vector的空间增长问题

capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。

这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义 的。vs是PJ版本STL,g++是SGI版本STL。

reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问 题。 resize在开空间的同时还会进行初始化,影响size。 

esize有两个参数,一个是开辟空间大小,一个是初始化大小

reverse只有一个参数,就是开辟空间大小

void test3_vector()
{
	vector<int> v1;
	v1.reserve(100);         //开辟一个100大小的空间
	cout << v1.capacity() << endl;
 
	vector<int> v2;
	v2.resize(10);          //开辟一个10个大小的空间,同时改变size,并通过半缺省来初始化
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;
 
	vector<int> v3;
	v3.resize(10, 3);  //将数据初始化为3
	for (auto e : v3)
	{
		cout << e << " ";
	}
	cout << endl;
}

2.3 vector的增删查改

void test4_vector()
{
	vector<int> v1;
	//增——push_back(尾插)
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	cout << "增:";
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
 
	//删——pop_back(尾删)
	v1.pop_back();
	cout << "删:";
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
 
	//查——find(这个是算法库中的接口,不是vector的接口,返回类型是查找位置的迭代器)
	auto pos1 = find(v1.begin(), v1.end(), 2);
	cout << "查:";
	cout << *pos1 << endl;    //如果没找到就不进行任何操作
 
	//在任意位置插入——insert
	//要先用find找到要插入的位置,然后再插入数据
	auto pos2 = find(v1.begin(), v1.end(), 2);
	if (pos2 != v1.end())
	{
		v1.insert(pos2, 20);
	}
	cout << "插入任意位置:";
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
 
	//在任意位置删除——erase
	//同样要先用find找到要删除的位置,然后再删除数据
	auto pos3 = find(v1.begin(), v1.end(), 2);
	v1.erase(pos3);
	cout << "删除任意位置:";
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
 
	//改——operator[]
	v1[0] = 100;
	cout << "改:";
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
}

 


http://www.kler.cn/a/368982.html

相关文章:

  • 【mod分享】极品飞车9冬日mod,支持光追,想体验一把冬天的Rockport市吗
  • 【损害和风险评估&坑洼】路面坑洼检测系统源码&数据集全套:改进yolo11-DCNV3
  • vLLM推理部署Qwen2.5
  • ubuntu nginx 已经安装 letsencrypt 如何获取免费证书
  • 卷积神经网络(CNNs)在处理光谱特征的序列属性时表现不佳
  • Lodash.js处理数组、对象、函数等常用方法介绍
  • 防火墙防御体系结构类型
  • uniapp开发小程序【点击头像实现更改头像、上传头像】
  • 【Linux】MyCat分库分表|读写分离
  • docker的持久化
  • QT:MaintenanceTool 模块安装工具
  • 快速对比:Django、Spring Boot、Node.js 和 PHP
  • 软件测试学习笔记丨Selenium学习笔记:元素定位与操作
  • Matlab的安装和破解
  • 【Pip】深入理解 Python 中的 pip 虚拟环境
  • App测试环境部署
  • 利用Spring Boot框架开发酒店住宿管理应用
  • 【论文阅读】jina-embeddings-v3: Multilingual Embeddings With Task LoRA
  • ChatGPT:从发布到全球大热,仅用一年多的传奇之旅
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23
  • 游戏服务器被攻击有办法防护吗
  • 51单片机之蜂鸣器驱动
  • MySQL笔试面试题之AI答(3)
  • jvm虚拟机介绍
  • PodCastLM:将PDF内容转化为音频播客的创新工具
  • AI智能电销机器人有什么功能?语音机器人系统搭建