C++vector容器

news2024/12/23 13:37:48

目录

1.vector基本概念

2.构造函数 

3.vector赋值操作,=,assign 

4.vector容量和大小 ,empty,capacity,size,resize

5.vector的插入和删除,push_back,pop_back,insert,erase,clear

6.vector数据存取,at,[],遍历

7.vector互换容器,swap

 8.vector预留空间reserve

1.vector基本概念

 

2.构造函数 

#include<iostream>
using namespace std;
#include<vector>
//vector容器构造

/*
//类型参数必须给,用模板时不认识iterator
template<class T>
void printVector(vector<T>&v)
{
	for (vector<T>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
//报错
*/
void printVector(vector<int>&v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector<int>v1;//默认构造,无参构造
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	//通过区间的方式构造,左闭右开
	vector<int>v2(v1.begin(), v1.end());
	printVector(v2);

	//n个elem方式构造
	vector<int>v3(10, 100);
	printVector(v3);

	//拷贝构造
	vector<int>v4(v3);
	printVector(v4);
}
int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

3.vector赋值操作,=,assign 

#include<iostream>
using namespace std;
#include<vector>
//vector赋值
void printVector(vector<int>&v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);
	
	//赋值 operator=
	vector<int>v2;
	v2 = v1;
	printVector(v2);

	//assign
	vector<int>v3;
	v3.assign(v1.begin(), v1.end());
	printVector(v3);

   //n个elem
	vector<int>v4;
	v4.assign(10, 100);
	printVector(v4);
}
int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

4.vector容量和大小 ,empty,capacity,size,resize

#include<iostream>
using namespace std;
#include<vector>
//vector容量和大小
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);
	//判断容器是否为空
	if (v1.empty())//v1.empty==ture为空
	{
		cout << "v1为空" << endl;
	}
	else
	{
		cout << "v1不空" << endl;
		cout << "v1.的容量为:" << v1.capacity() << endl;//输出13
		cout << "v1的大小为:" << v1.size() << endl;//输出
		//至于为什么10个数容量是13,因为会动态扩容
		//当你再插入三个之后,再去插入数据,根据动态扩容又生成更大的空间
	}
	//重新指定大小
	//如果重新指定的比原来长,默认用0填充新的位置
	v1.resize(15);
	//v1.resize(15,100);//指定默认填充之为100
	printVector(v1);//输出:0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
	//如果重新指定的比原来短,超出的部分会删除掉
	v1.resize(5);
	printVector(v1);//输出:0 1 2 3 4
}
int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

5.vector的插入和删除,push_back,pop_back,insert,erase,clear

#include<iostream>
using namespace std;
#include<vector>
//vector插入和删除
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector<int>v1;
	//尾插
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	//遍历
	printVector(v1);//输出:10 20 30 40 50
	
	//尾删
	v1.pop_back();
	printVector(v1);//输出:10 20 30 40

	//插入 第一个参数是迭代器
	v1.insert(v1.begin(), 100);//输出:100 10 20 30 40
	//想在一个下标之前插入的话,:v1.insert(v1.begin() + 下标(0就不用写了), 值)
	//v1现在是100 10 20 30 40,在20前面插入200
	v1.insert(v1.begin()+2, 200);//输出:
	printVector(v1);//输出:100 10 200 20 30 40
	//在指定的迭代器位置插入n个数据
	v1.insert(v1.begin(), 2, 1000);
	printVector(v1);//输出:1000 1000 100 10 200 20 30 40

	//删除 参数也是迭代器
	v1.erase(v1.begin());
	printVector(v1);//输出:1000 100 10 200 20 30 40
	//v1现在是1000 100 10 200 20 30 40,如何删除200?
	v1.erase(v1.begin() + 3);
	printVector(v1);//输出:1000 100 10 20 30 40

	//删除区间
	//v1现在是1000 100 10 20 30 40,如何删除100 10?
	v1.erase(v1.begin() + 1, v1.begin() + 3);
	printVector(v1);//输出:1000 20 30 40

	//清空
	v1.clear();
	printVector(v1);
}

int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

6.vector数据存取,at,[],遍历

#include<iostream>
using namespace std;
#include<vector>
//vector 容器 数据存取
void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	//遍历,利用[]访问vector中的元素
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	//遍历,利用at访问vector中的元素
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1.at(i) << " ";
	}
	cout << endl;

	vector<int>::iterator it=v1.begin();
	//获取第一个元素
	cout << "第一个元素为:" << v1.front() << " " << v1[0] << " " << *it << endl;

	it = v1.end()-1;
	//获取最后一个元素
	cout << "第一个元素为:" << v1.back() << " " << v1[v1.size()-1] << " " << *it << endl;
}

int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

7.vector互换容器,swap

#include<iostream>
using namespace std;
#include<vector>
//vector 容器 的互换
void printVector(vector<int>& v)
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}
//1.基本使用
void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	cout << "交换前:" << endl;
	printVector(v1);
	vector<int>v2;
	for (int i = 10; i >=0; i--)
	{
		v2.push_back(i);
	}
	printVector(v2);
	cout << "交换后:" << endl;
	v1.swap(v2);
	printVector(v1);
	printVector(v2);
}
//实际用途
//巧用swap可以收缩内存空间
void test02()
{
	vector<int>v;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
	}
	cout << "v的容量:" << v.capacity ()<< endl;
	cout << "v的大小:" << v.size() << endl;

	v.resize(3);//重新指定大小
	cout << "v的容量:" << v.capacity() << endl;
	cout << "v的大小:" << v.size() << endl;//v的容量不变,大小为3

	//巧用swap收缩内存
	vector<int>(v).swap(v);
	cout << "v的容量:" << v.capacity() << endl;
	cout << "v的大小:" << v.size() << endl;//v的容量和大小都为3
	/*
	vector<int>(v)匿名对象
	利用拷贝构造函数创建新的对象
	按照v的大小,初始化匿名对像的大小,匿名对像的容量也是3
	这个匿名对象拥有v的全部数据,但是,没有空闲的空间,
	也就是说,这个匿名对象的 容量 和 大小 是相等的
	swap后匿名对象再调用swap函数实现与容器v的互换,
	原本的容器v就会指向这个容量大小均为3的内存块
    匿名对象现在就指向了容量较大的内存块,由于匿名对象的特性,
    该行结束后,系统会自动回收匿名对象占用的内存,从而实现了内存收缩
	*/
}
int main()
{
	test01();
	test02();
	system("pause");//按任意键继续
	return 0;
}

 8.vector预留空间reserve

#include<iostream>
using namespace std;
#include<vector>
//vector 容器 预留空间
void printVector(vector<int>& v)
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}
//1.基本使用
void test01()
{
	vector<int>v;
	int num = 0;//统计开辟的次数
	int* p = NULL;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			num++;
		}
		/*
		这段代码也可以统计开辟次数
		if (v.capacity() == v.size()) 
		{
			num++;
		}
		num++;
		cout<<num<<endl;
		*/
	}
	cout << "num = " << num << endl;
	//利用reserve预留空间,不需要重复开辟内存
	vector<int>v1;
	v1.reserve(100000);
	int num1 = 0;//统计开辟的次数
	int* p1 = NULL;
	for (int i = 0; i < 100000; i++)
	{
		v1.push_back(i);
		if (p1 != &v1[0])
		{
			p1 = &v1[0];
			num1++;
		}
	}
	cout << "num1 = " << num1 << endl;
}

int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++之引用(上)

文章目录前言一、引用二、引用的写法三、引用特性1.引用在定义时必须初始化2. 一个变量可以有多个引用3. 引用一旦引用一个实体&#xff0c;再不能引用其他实体三、引用的权限&#xff08;含例子&#xff09;四、常引用总结前言 今天要介绍的是C中的一个新概念——引用。 一、…

MobaXterm使用指南

MobaXterm使用指南 1. 介绍 通俗的来讲&#xff0c;MobaXterm就是一款SSH客户端&#xff0c;它帮助我们在Windows操作系统下去连接并操作Linux服务器。MobaXterm 又名 MobaXVT&#xff0c;是一款增强型终端、X 服务器和 Unix 命令集(GNU/ Cygwin)工具箱。MobaXterm 可以开启多…

Django网页+Yolov5垃圾识别系统

Django网页Yolov5垃圾识别系统如需安装运行环境或远程调试&#xff0c;见文章底部个人微信或QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<Django网页Yolov5垃圾识别系统>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易…

代码随想录NO33 |Leetcode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

贪心LeetCode_860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球今天是贪心第四天的题了&#xff0c;快开始dp了&#xff01;大头啊&#xff01; 860.柠檬水找零 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&am…

day28|1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

1005.K次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可能的…

若依框架实现多级联动下拉

最近也是用到了若依的多级联动&#xff0c;效果如下&#xff08;可多级&#xff09; 若依有已经封装好的一套js&#xff0c;难点在于后端数据封装&#xff0c;前端按照封装好的代码引用即可。 这里主要分享下关于后端数据如何封装多层。后端代码直接奉上。 记得要把集合转j…

SpringBoot+Vue+Wx新冠疫苗预约系统

简介&#xff1a;本项目采用了基本的springbootvue微信小程序设计的新冠疫苗预约系统。详情请看主要截图。经测试&#xff0c;本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVueWx新冠疫苗预约系统源码作者LHL项目类型Java…

python爬虫正则表达式

博主简介&#xff1a;博主是一个大二学生&#xff0c;主攻人工智能领域研究。感谢缘分让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;C&#xff0c;python&#xff0c;爬虫等方面的知识分享。如果有需要的小伙伴&#xff0c;可以关注博主&#xff…

零碎的算法笔记(1)

From算法竞赛入门经典 第2版1.判断 n 是否为完全平方数2. 比较大的数组应尽量声明在 main 函数外&#xff0c;否则程序可能无法运行 3.开灯问题1.判断 n 是否为完全平方数 可以先求出其平方根&#xff0c;然后看它是否为整数&#xff0c;即用一个 int 型变量 m 存储 sqrt(n&am…

C++入门(二)

C入门&#xff08;二&#xff09;1.引用1.1引用概念1.2引用特性1.3常应用1.4使用场景1.5传值、传引用效率比较1.6引用和指针的区别2.内联函数2.1概念2.2内联函数的特性3.auto关键字&#xff08;C11&#xff09;3.1auto使用细则4.基于范围的for循环&#xff08;C11&#xff09;5…

题库——“C”

由于小雅兰的C语言程序设计考试的时间实在是越来越近了&#xff0c;那么&#xff0c;这篇博客也就产生了&#xff0c;这篇博客的主要内容是一些C语言程序设计的练习题&#xff0c;现在&#xff0c;就让我们一起进入C语言的世界吧。 1.函数fun的功能是&#xff1a;将形参n中&…

Java Agent 内存马攻防

前言 在 jdk 1.5 之后引入了 java.lang.instrument 包&#xff0c;该包提供了检测 java 程序的 Api&#xff0c;用于监控、收集性能信息、诊断问题等。通过 java.lang.instrument 实现的工具我们称之为 Java Agent &#xff0c;Java Agent 能够在不影响正常编译的情况下来修改…

黑马主播单场带货千万,抖音直播市场还有哪些新机遇?

1月受春节假期影响&#xff0c;主播带货场次降低&#xff0c;抖音直播电商市场略显低迷&#xff0c;据新抖『直播带货风向』大盘数据显示&#xff0c;1月平台直播销量与去年12月相比下降39.55%&#xff0c;直播销售额下降也较为明显。了解更多行业带货风向&#xff0c;可点此处…

【C++11】可变参数模板

目录 可变参数模板 函数递归展开参数包 逗号表达式展开参数包 emplace_back 可变参数模板 其实C语言中我们就一直在使用可变参数列表。 C11 的新特性可变参数模板能够让我们创建可变参数的函数模板和类模板&#xff0c;相比C98和C03&#xff0c;类模板和函数模板中只能传入…

19《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享

《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限&#xff0c;如果错误欢迎批评指正。 第四章&#xff1a;Protein Binding Leads to Biological Actions &#xff08;蛋白质的结合会产生生物作用&#xff09; -布朗棘轮在耦合结合的过…

独角兽大牛纯手肛出的一份多线程实战文档,莫把它丢进收藏夹吃灰

为什么用多线程&#xff1f; 在操作系统级别上&#xff0c;程序的执行都是以进程为单位&#xff0c;而每一个进程中通常都会有多个线程线程互不影响地并发执行&#xff0c;那么为什么要使用多线程呢&#xff1f;其实&#xff0c;多线程的使用为程序研发带来了巨大的便利&#…

删除重复数字的三种方法(详解)

前言&#xff1a;本期是关于去重数字的三种方法详解&#xff0c;今天你c了吗&#xff1f; 输入描述&#xff1a; 第一行&#xff0c;输入一个整数n&#xff0c;表示序列有n个整数。 第二行输入n个整数&#xff08;每个整数大于等于1&#xff0c;小于等于1000&#xff09;&…

关于模板字面量,我有点好奇它的内部结构

前言 最近翻看源码的时候&#xff0c;发现一些有趣的 JS 的知识点&#xff0c;基于日常的开发经验&#xff0c;我做了一些联想和对比。整个过程充满了乐趣。 于是我想&#xff0c;是不是可以延续这种创意带来的学习的乐趣。 带的富含创造力夜晚的 buff&#xff0c;确实让我拥…

一、系统编程常用api

一、文件io文件io是linux系统提供的接口&#xff0c;针对文件和磁盘进行操作&#xff0c;不带缓存机制标准io是c语言函数库里的标准io模型&#xff0c;在stdio.h中定义&#xff0c;通过缓冲区操作文件&#xff0c;带有缓存机制标准 IO 和文件 IO 的区别如下图所示&#xff1a;文…

SSD(固态) VS HDD(机械),购买指南

大多数人买电脑的时候纠结买固态硬盘&#xff08;SSD&#xff09;还是机械硬盘(HDD)。哪个是最佳选择呢&#xff0c;是固态硬盘还是机械硬盘呢&#xff1f;这个问题没有直接的答案&#xff0c;每个购买者有不同的需求&#xff0c; 需要根据需求做选择。这些需求像是性能、和预算…