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

C++ vector的使用

###vector介绍:

vector是C++中引入的类模板,这个模板相当于顺序表,里面可以存放不同类型的数据,同时实现了多个接口去完成对vector对象的各种操作;

基本使用方式:

#include<vector>//包含头文件

using namespace std;//展开头文件中的命名空间

int main()

{

        vector<int> v;//定义一个vector对象,这个对象存放的是int类型的数据;

}

一、vector的构造、析构和赋值

1、构造

  • 不传参数构造,这个vector中没有数据;

  • 第一个参数为数据个数,第二个参数为数据值,完成构造;

  • 用已存在的vector去构造另一个vector;

  • 用已存在的vector的一部分去初始化;

  • 用数组去初始化(两个参数都是指向数组元素的指针,指针之间包含的数据就是要去初始华的数据)。 
void test01()
{
	//不初始化,v1里面没有数据
	vector<int> v1;
	cout << "data:";
	for (auto i : v1)
	{
		cout << i << ' ';
	}
	cout << endl;

	//用10个1初始化
	vector<int> v2(10, 1);
	cout << "data:";
	for (auto i : v2)
	{
		cout << i << ' ';
	}
	cout << endl;
	//用vector去初始化vector
	vector<int> v3(v2);
	cout << "data:";
	for (auto i : v3)
	{
		cout << i << ' ';
	}
	cout << endl;

	//用vector对象的一部分去初始化(使用迭代器)
	vector<int> v4(v3.begin() + 1, v3.end() - 1);
	cout << "data:";
	for (auto i : v4)
	{
		cout << i << ' ';
	}
	cout << endl;

	//用数组初始化
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//可以理解为地址的范围中含有的数据
	vector<int> v5(arr, arr+sizeof(arr) / sizeof(arr[0]));
	cout << "data:";
	for (auto i : v5)
	{
		cout << i << ' ';
	}
	cout << endl;
}

2、析构

清除所有的元素,并且把vector对象申请的空间释放

3、赋值

将一个vector对象的元素个数,数据值,容量大小赋值给另一个对象,但是两个vector对象的地址不变

二 、迭代器

 与string的迭代器类似

void test02()
{
	vector<int> v1(10,9);
	vector<int>::iterator it = v1.begin();
	while (it != v1.end())
	{
		(*it)++;
		cout << *it << " ";
		it++;
	}
	cout << endl;
	vector<int>::const_iterator cit = v1.cbegin();//cit指向的数据不能被改变
	while (cit != v1.cend())
	{
		cout << *cit << " ";
		cit++;
	}
}

 三、容量:

	vector<int> v1(10, 1);
	//size
	cout << v1.size() << endl;
	//capacity
	cout << v1.capacity() << endl;
	//empty
	cout << v1.empty() << endl;

不为空,empty返回假,0代表假;

reserve在VS里面默认只会扩大,当要reserve的值比vector对象的容量小时,不改变capacity

	//reserve
	vector<int> v2(10, 9);
	v2.reserve(20);
	cout << v2.size() << endl;
	cout << v2.capacity() << endl;
	v2.reserve(5);
	cout << v2.size() << endl;
	cout << v2.capacity() << endl;
	v2.reserve(30);
	cout << v2.size() << endl;
	cout << v2.capacity() << endl;

 resize 改变对象size的值;缩小就相当于从尾部删除数据,增大就从尾部加数据,这些加的数据可以给特定的值:

	//resize
	vector<int> v3(10, 1);
	cout << v3.size() << endl;
	cout << v3.capacity() << endl;
	for (auto i : v3)
	{
		cout << i << " ";
	}
	cout << endl;

	v3.resize(5);
	cout << v3.size() << endl;
	cout << v3.capacity() << endl;
	for (auto i : v3)
	{
		cout << i << " ";
	}
	cout << endl;

	v3.resize(20,9);
	cout << v3.size() << endl;
	cout << v3.capacity() << endl;
	for (auto i : v3)
	{
		cout << i << " ";
	}
	cout << endl;

当resize扩大size时,不给特定的值,就默认为0。

四、元素获取

void test04()
{
	vector<int> v1(10, 1);
	//通过下标访问数据//[]
	for (size_t i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << ' ';
	}
	cout << endl;

	//at
	for (size_t i = 0; i < v1.size(); i++)
	{
		cout <<v1.at(i)<< ' ';
	}
	cout << endl;

	//front back分别获取第一个个最后一个的数据
	vector<int> v2(10);
	v2[0] = 100;
	v2[v2.size()-1] = 999;
	cout << v2.front() << endl;
	cout << v2.back() << endl;

	//data获取vector对象的地址
	vector<int> v3(10, 9);
	int* p = v3.data();//此时p是v3首个数据的地址
	*p = 100;
	p++;//第二个数据地址
	*p = 200;
	p[2] = 400;//p从第二个数据的地址往后加2,就是原数据的第四个数据的地址
	for (size_t i = 0; i < v3.size(); i++)
	{
		cout << v3[i] << ' ';
	}
}

 

五、修改

尾插和尾删

	//push_back、pop_back
	//尾插和尾删
	vector<int> v1(10, 10);
	v1.push_back(999);
	v1.push_back(888);
	v1.pop_back();
	for (auto i : v1)
	{
		cout << i << " ";
	}
	cout << endl;

insert插入数据,vector里面涉及的insert相比于string更加简洁;这里的position都是迭代器操作的

  1. 在position位置之前插入数据val;
  2. 在position位置之前插入n个val数据;
  3. 在一个vector对象的position位置之前插入另一个vector对象的一段迭代器区间中的数据;

 

	//insert
	vector<int> v1(10, 10);
	v1.insert(v1.begin()+6, 999);
	for (auto i : v1)
	{
		cout << i << " ";
	}
	cout << endl;

	v1.insert(v1.begin(), 3, 888);
	for (auto i : v1)
	{
		cout << i << " ";
	}
	cout << endl;

	vector<int> v2(10, 6);
	v1.insert(v1.begin(), v2.begin() + 5, v2.end());
	for (auto i : v1)
	{
		cout << i << " ";
	}
	cout << endl;

erase删除一个或者一段数据,通过迭代器实现

	//erase
	vector<int> v1(10);
	for (size_t i = 0; i < v1.size(); i++)
	{
		v1[i] = i;
	}
	for (auto i : v1)
{
	cout << i << " ";
}
	cout << endl;
	//删除一个数据
	v1.erase(v1.begin());
	for (auto i : v1)
{
	cout << i << " ";
}
	cout << endl;
	//删除一段数据
	v1.erase(v1.begin(), v1.end() - 5);
	for (auto i : v1)
{
	cout << i << " ";
}

 


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

相关文章:

  • 2024.11.12_大数据的诞生以及解决的问题
  • ODOO学习笔记(8):模块化架构的优势
  • 修改yolo格式的labels类别、删除yolo格式的labels类别
  • 单元测试、集成测试、系统测试有什么区别
  • 深入理解接口测试:实用指南与最佳实践5.0(二)
  • 区块链技术在电子政务中的应用
  • IO模型---BIO、NIO、IO多路复用、AIO详解
  • 【CTF Web】BUUCTF BUU UPLOAD COURSE 1 Writeup(文件上传+PHP+文件包含漏洞)
  • 高等数学 2.5 函数的微分
  • Qt 中openMp 配置
  • QT操作数据库
  • Vue3+Element Plus:使用el-dialog,对话框可拖动,且对话框弹出时仍然能够在背景页(对话框外部的页面部分)上进行滚动以及输入框输入信息
  • (c++)函数的分文件编写
  • [创业之路-146] :如何理解:复杂的事情简单化,简单的事情标准化,标准的事情流程化,流程的事情数字化,数字化的事情自动化,自动化的事情智能化
  • Chisel简明教程
  • 【大模型实战篇】高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍
  • JDK的选择安装和下载
  • 软考 -- 软件设计师 -- 二轮复习(3) -- 数据结构(持续更新)
  • 24.Redis实现全局唯一ID
  • 电脑信息安全:挑战与应对策略
  • PAT甲级-1055 The World‘s Richest
  • 【C++学习入门】6.左值右值
  • 软件测试方法及其应用概述
  • JZ2440开发板——S3C2440的时钟体系
  • RFID射频模块(MFRC522 STM32)
  • Linux 之父 Linus Torvalds:低调的神话创造者