C++初阶——vector

news2024/12/22 19:41:10

一、什么是vector

        vector是表示可变大小的数组的序列容器,就像数组一样,vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效,但是它的大小是动态可变的,并且它的大小会被容器自动处理

二、vector的构造

        常用的构造函数:

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

        笔者想要特别提一下这种构造方式:

vector(size_type n, const value_type& val=value_type())

         这里如果没有显式提供要初始化实例,则会调用该类型的默认构造函数进行初始化,如果是整型则会默认初始化为0,如果是自定义类型:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class A
{
public:
	int a;
	int b;
	int c;
	A()
		:a(1),b(2),c(3)
	{}
};
int main()
{
	A k;
	k.a = 4;
	k.b = 3;
	vector<A> v1(1,k);
	cout << v1[0].a << " " << v1[0].b << " " << v1[0].c << endl;
	vector<A> v2(1);
	cout << v2[0].a << " " << v2[0].b << " " << v2[0].c << endl;
    return 0;
}

 输出结果为:

        可以看到,如果是自定义类型给出第二个参数会进行拷贝构造,不给则会进行默认构造。 

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

int main()
{
	vector<int> v1;//无参构造
	vector<int> v2(10, 1);//构造并初始化为1
	vector<int> v3(10);//构造,不给参数会根据元素的类型进行默认初始化
	vector<int> v4(v2);//拷贝构造
	string s1("hello world");
	vector<int> v5(s1.begin(), s1.end());//这样可行吗?里面存储的是什么?
}

三、vector的迭代器

iterator的使用接口说明
begin+endbegin获取第一个数据的位置,end获取最后一个数据的下一个位置
rbegin+rendrbegin获取最后一个数据的位置,rend获取第一个数据的前一个位置

函数原型:

iterator begin() noexcept;
const_iterator begin() const noexcept;

iterator end() noexcept;
const_iterator end() const noexcept;

reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;

reverse_iterator rend() noexcept;
const_reverse_iterator rend() const noexcept;

 迭代器的使用:

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

int main()
{
	int k = 0;
	vector<int> v1(10);
	for (auto& i : v1)
	{
		i += k;
		++k;
	}
	vector<int>::iterator it = v1.begin();
    //auto it = v1.begin()也可以写成这样
	while (it != v1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	vector<int>::reverse_iterator it2 = v1.rbegin();
	while (it2 != v1.rend())
	{
		cout << *it2 << " ";
		++it2;
	}
}

 输出结果为:

四、vecotr的容量

容量空间接口说明
size获取已存在的数据的个数
capacity获取最多能容纳的数据的个数
empty判断容器是否为空
resize改变vector的size
reserve改变capacity或者预留空间

函数原型:

size_type size() const noexcept;

size_type capacity() const noexcept;

bool empty() const noexcept;

void resize (size_type n);
void resize (size_type n, const value_type& val);

void reserve (size_type n);

 容量相关的函数使用:

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

int main()
{
	vector<int> v1(10,1);
	cout << "初始:" <<endl;
	cout << "v1.size():" << v1.size() << endl;
	cout << "v1.capacity():" << v1.capacity() << endl;
	v1.reserve(20);
	cout << "扩容:" << endl;
	cout << "v1.size():" << v1.size() << endl;
	cout << "v1.capacity():" << v1.capacity() << endl;
	v1.reserve(5);
	cout << "reverse减少空间:" << endl;
	cout << "v1.size():" << v1.size() << endl;
	cout << "v1.capacity():" << v1.capacity() << endl;
	v1.resize(5);
	cout << "resize减少空间:" << endl;
	cout << "v1.size():" << v1.size() << endl;
	cout << "v1.capacity():" << v1.capacity() << endl;
}

 输出结果:

     可以发现,reverse函数只能扩容,不能进行容量缩减,resize函数可以减少size但是不能改变分配的内存空间的大小。   

五、vector的增删查改   

crud函数接口说明
push_back在尾部插入一个数据

       pop_back

删除尾部的一个数据
find查找一个函数第一次出现的下标,但是不是vector的成员
insert在给定的pos前插入一个元素
erase删除给定的pos位置的元素
swap交换两个vector的数据空间
operator[]能够像数组一样访问vector

函数原型:

void push_back (const value_type& val);

void pop_back();

template <class InputIterator, class T>
    InputIterator find(InputIterator first, InputIterator last, const T& value);

iterator insert (const_iterator position, const value_type& val);
iterator insert (const_iterator position, size_type n, const value_type& val); 
template <class InputIterator>
    iterator insert (const_iterator position, InputIterator first, InputIterator last);

iterator erase (const_iterator position);//擦除对应位置的一个
iterator erase (const_iterator first, const_iterator last);//擦除迭代器对应的一段

void swap (vector& x);

reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

函数的使用:

push_back函数与pop函数:

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

int main()
{
	vector<int> v(10);
	v.push_back(10);
	cout << "插入后:";
	for (auto i : v)
	{
		cout << i << " ";
	}
	v.pop_back();
	v.pop_back();
	cout << endl;
	cout << "删除后:";
	for (auto i : v)
	{
		cout << i << " ";
	}
	return 0;
}

输出结果:

find函数:

        find函数实际上是算法标准库中的一个函数,不是任何一个容器的成员函数。它返回一个迭代器,如果找到则返回对应元素的一个迭代器,否则返回传入的第二个参数,可以配合insert函数和erase函数使用。

template <class InputIterator, class T>
    InputIterator find(InputIterator first, InputIterator last, const T& value);
#include<iostream>
#include<vector>
#include<string>
using namespace std;

int main()
{
	vector<int> v = { 1,2,3,4,5,6,3,8,9 };
	auto it = find(v.begin(), v.end(), 3);
	if (it != v.end())
		cout << "发现" << *it << "在位置:" << it - v.begin();
	else
		cout << "没有发现";
	return 0;
}

 输出结果为:

insert函数:

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

int main()
{
	int k = 0;
	vector<int> v(10);
	for (auto& i : v)
	{
		i = k;
		++k;
	}
	vector<int> v1(10,1);
	vector<int> v2(10, 1);
	vector<int> v3(10, 1);
	v1.insert(v1.begin() + 2, 10);//只增加一个数据
	v2.insert(v2.begin()+2, 2,10);//增加自定义个数据
	v3.insert(v3.begin() + 2, v.begin() + 1, v.begin() + 7);//使用迭代器进行插入
	cout << "v1:";
	for (auto i : v1)
	{
		cout << i << " ";
	}
	cout << endl;
	cout << "v2:";
	for (auto i : v2)
	{
		cout << i << " ";
	}
	cout << endl;
	cout << "v3:";
	for (auto i : v3)
	{
		cout << i << " ";
	}
	return 0;
}

输出结果为:

erase函数: 

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

int main()
{
	vector<int> v1 = { 1,2,3,4,5,6,7,8,9 };
	vector<int> v2 = { 1,2,3,4,5,6,7,8,9 };
	v1.erase(v1.begin() + 2);
	cout << "v1删除后:";
	for (auto i : v1)
	{
		cout << i << " ";
	}
	cout << endl;
	v2.erase(v2.begin() + 2, v2.begin() + 5);
	cout << "v2删除后:";
	for (auto i : v2)
	{
		cout << i << " ";
	}
	return 0;
}

输出结果为:

swap函数: 

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

int main()
{
	vector<int> v1 = { 1,2,3,4,5 };
	vector<int> v2 = { 5,6,7,8,9 };
	v1.swap(v2);
	cout << "v1:";
	for (auto i : v1)
	{
		cout << i << " ";
	}
	cout << endl;
	
	cout << "v2:";
	for (auto i : v2)
	{
		cout << i << " ";
	}
	return 0;
}

输出结果:

operator[]: 

        可以通过[]像数组那样访问vector:

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

int main()
{
	vector<int> v1 = { 1,2,3,4,5,6,7,8,9};
	for (int i = 0; i < v1.size(); ++i)
		cout << v1[i] << " ";
	return 0;
}

输出结果为:

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

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

相关文章

GIT的基本使用与进阶

GIT的简单入门 一.什么是git&#xff1f; Git 是一个开源的分布式版本控制系统&#xff0c;用于跟踪文件更改、管理代码版本以及协作开发。它主要由 Linus Torvalds 于 2005 年创建&#xff0c;最初是为 Linux 内核开发而设计的。如今&#xff0c;Git 已经成为现代软件开发中…

CulturalBench :一个旨在评估大型语言模型在全球不同文化背景下知识掌握情况的基准测试数据集

2024-10-04&#xff0c;为了提升大型语言模型在不同文化背景下的实用性&#xff0c;华盛顿大学、艾伦人工智能研究所等机构联合创建了CulturalBench。这个数据集包含1,227个由人类编写和验证的问题&#xff0c;覆盖了包括被边缘化地区在内的45个全球区域。CulturalBench的推出&…

C语言中,“extern”关键字的含义与用法

在C语言中&#xff0c;extern 关键字用于声明一个已经在其他地方定义的变量或函数。它的主要作用是告诉编译器&#xff0c;某个变量或函数是在当前文件之外定义的&#xff0c;编译器应该在链接阶段找到这个变量或函数的实际定义。以下是 extern 的一些常见用途和用法&#xff1…

「Mac玩转仓颉内测版1」入门篇1 - Cangjie环境的搭建

本篇详细介绍在Mac系统上快速搭建Cangjie开发环境的步骤&#xff0c;涵盖VSCode的下载与安装、Cangjie插件的离线安装、工具链的配置及验证。通过这些步骤&#xff0c;确保开发环境配置完成&#xff0c;为Cangjie项目开发提供稳定的基础支持。 关键词 Cangjie开发环境搭建VSC…

Kubernetes网络揭秘:从DNS到核心概念,一站式综述

文章目录 一.overlay vs underlayL2 underlayL3 underlay 二、calico vs flannel2.1 calico架构2.2 flannel架构 三、iptables四、Vxlan五、kubernetes网络架构综述六、DNS七、Kubernetes域名解析策略 一.overlay vs underlay overlay网络是在传统网络上虚拟出一个虚拟网络&am…

飞凌嵌入式FET527N-C核心板现已适配Android 13

飞凌嵌入式FET527N-C核心板现已成功适配Android13&#xff0c;新系统的支持能够为用户提供更优质的使用体验。那么&#xff0c;运行Android13系统的FET527N-C核心板具有哪些突出的优势呢&#xff1f; 1、性能与兼容性提升 飞凌嵌入式FET527N-C核心板搭载了全志T527系列高性能处…

破解仓库管理难题!库存管理流程详解

随着市场竞争加剧和客户需求不断提升&#xff0c;企业的仓库管理在日益复杂的供应链环境中面临诸多挑战。许多企业在仓库管理上仍停留在传统手工操作或基础的数字化管理阶段&#xff0c;这种方式容易导致库存信息不准确、管理效率低下、数据滞后等问题。 企业现状 当前&#…

电缆管道高效智能化管理:智能电缆管道可视化机器人

电缆管道高效智能化管理&#xff1a;智能电缆管道可视化机器人 电缆管道作为城市“生命线”的重要组成部分&#xff0c;其安全性和可靠性日益受到重视。然而&#xff0c;传统的人工巡检方式存在诸多不足&#xff0c;如巡检效率低下、安全隐患大、难以发现隐蔽故障等。 很多电力…

tomcat启动失败和缓存清理办法

tomcat只在学校接触过并且是在window xp和win7的电脑上配置过&#xff08;中途升级过电脑系统&#xff09;&#xff0c;只记得在windows系统上可以将其设置成服务管理。但我已毕业10多年了&#xff0c;学的知识早就不知道丢哪里了。这次为了修改一个07&#xff0c;08年的项目&a…

RDD 算子全面解析:从基础到进阶与面试要点

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…

如何在CentOS 7上搭建SMB服务

如何在CentOS 7上搭建SMB服务 因项目测试需求&#xff0c;需要自行搭建SMB服务&#xff0c;**SMB&#xff08;Server Message Block&#xff09;**协议是一种常用的文件共享方式&#xff0c;它可以让不同操作系统之间共享文件、打印机等资源。本文将带你一步步搭建一个简单的S…

ubuntu18.04 配置安卓编译环境

目前有个项目&#xff0c;验收时有个要求是在linux中进行编译打包生成apk文件。我平时都是在windows环境android studio中进行打包的&#xff0c;花了半天时间研究了一下&#xff0c;记录如下&#xff1a; 安装安卓sdk cd /opt wget https://dl.google.com/android/reposito…

英伟达HOVER——用于人形机器人的多功能全身控制器:整合不同的控制模式且实现彼此之间的无缝切换

前言 前几天&#xff0c;一在长沙的朋友李总发我一个英伟达HOVER的视频(自从我今年年初以来持续不断的解读各大顶级实验室的最前沿paper、以及分享我司七月在具身领域的探索与落地后&#xff0c;影响力便越来越大了&#xff0c;不断加油 )&#xff0c;该视频说的有点玄乎&…

C语言中“type”的含义

在C语言中&#xff0c;“type”是指数据类型&#xff0c;它定义了变量可以存储的数据种类以及可以对这些数据执行的操作。C语言提供了一系列基本的数据类型&#xff0c;它们包括但不限于&#xff1a; 整型&#xff08;Integer Types&#xff09;&#xff1a; int&#xff1a;用…

ffmpeg 视频滤镜:屏蔽边框杂色- fillborders

滤镜描述 fillborders 官网链接 > FFmpeg Filters Documentation fillborders滤镜有几种方式帮你屏蔽边框的杂色、不好的图案。 滤镜使用 参数 left <int> ..FV.....T. set the left fill border (from 0 to INT_MAX) (default 0)right …

云计算答案

情境一习题练习 一、选择题 1、在虚拟机VMware软件中实现联网过程&#xff0c;图中箭头所指的网络连接方式与下列哪个相关&#xff08; C &#xff09;。 A.仅主机模式 B.桥接 C.NAT D.嫁接 2、请问下图这个虚拟化架构属于什么类型&#xff08; A …

[ Linux 命令基础 2 ] Linux 命令详解-系统管理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Golang | Leetcode Golang题解之第554题砖墙

题目&#xff1a; 题解&#xff1a; func leastBricks(wall [][]int) int {cnt : map[int]int{}for _, widths : range wall {sum : 0for _, width : range widths[:len(widths)-1] {sum widthcnt[sum]}}maxCnt : 0for _, c : range cnt {if c > maxCnt {maxCnt c}}retur…

QT中使用图表之QChart绘制动态折线图

使用QChart绘制一个随着时间的变化而动态显示的折线图 每一秒增加1个点&#xff0c;总共显示10s内的数据 显然x轴我们使用日期时间轴 同时使用1个定时器&#xff0c;每隔1秒往折线系列中添加1个数据进去 步骤如下&#xff1a; 1、创建图表视图 //1、创建图表视图 QChartV…

自然语言处理在客户服务中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 自然语言处理在客户服务中的应用 自然语言处理在客户服务中的应用 自然语言处理在客户服务中的应用 引言 自然语言处理概述 定义…