【C++】STL---vector基本用法介绍

个人主页:平行线也会相交💪

欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创

收录于专栏【C++之路】💌

本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍

希望我们一起努力、成长,共同进步。🍓

vectorC++STL 中的一种动态数组容器 ,用于存储和操作一系列的元素。

同时vector提供了灵活的大小调整、随机访问、连续存储、动态内存管理等特点。

注意使用vector前需要包含头文件#include<vector>
下面将对vector的常用语法作出详细的介绍。

目录

一、vector初始化

1.1一般初始化方式

例1:创建一个具有5个整型元素的向量

cpp 复制代码
//v1是一个具有5个int类型元素大小的向量
vector<int> v1(5);

例2:创建一个具有5个int类型元素大小的向量,并要将每个元素初始化成0。

cpp 复制代码
//v2是一个具有5个int类型元素大小的向量,其中每个元素都是0
vector<int> v2(5, 0);

例3:创建5个string类型的向量,并完成初始化操作。

cpp 复制代码
vector<string> v(5, "C++");

1.2利用迭代器进行初始化

例1:利用相同类型的迭代器进行初始化。

cpp 复制代码
利用相同类型的迭代器进行初始化
vector<int> v1(10, 1);
vector<int> v2(v1.begin(), v1.end());
for (auto e : v2)
{
	cout << e << " ";
}

例2:利用不同类型的迭代器进行初始化。

cpp 复制代码
//利用不同类型的迭代器进行初始化
string str("hello C++");

vector<int> v3(str.begin(), str.end());
vector<char> v4(str.begin(), str.end());

for(auto e : v3)
	cout << e << " ";
cout << endl;
for (auto e : v4)
	cout << e << " ";
cout << endl;

1.3利用数组指针进行初始化

cpp 复制代码
//利用数组指针进行初始化
int a[] = { 1,2,3,4 };
vector<int> v5(a, a + 4);

二、vector的增删查改

2.1增添元素-push_back()

方法1 :使用成员函数push_back()

cpp 复制代码
vector<int> v3;
	v3.push_back(1);
	v3.push_back(2);
	v3.push_back(3);
	v3.push_back(4);


方法2:使用for循环进行赋值

cpp 复制代码
vector<int> v4;
for (int i = 0; i < 10; i++)
	v4.push_back(i);

2.2删除元素-erase()

cpp 复制代码
int a[] = { 1,3,5,7,9 };
vector<int> v(a, a + 5);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

//删除第一个位置的值
v.erase(v.begin());
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

//删除第三个位置的值
v.erase(v.begin()+2);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

2.3某个位置插入元素-insert()

cpp 复制代码
int a[] = { 1,3,5,7,9 };
vector<int> v(a, a + 5);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

v.insert(v.begin(), 100);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

2.4查找-find()

这里需要注意的是:

虽然vector容器本身没有直接提供查找函数即find的成员函数,但通过包含<algorithm>头文件,你可以使用find算法函数来在vector中查找元素。这是因为标准库提供了一种通用的查找函数,可以在各种容器中使用。

举个例子:

cpp 复制代码
//查找元素
int a[] = { 0,2,4,6,8,10,12 };
vector<int> v(a, a + sizeof(a) / sizeof(a[0]));
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

vector<int>::iterator pos = find(v.begin(), v.end(), 8);
if (pos != v.end())
	v.erase(pos);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

三、vector迭代器的使用(iterator)

3.1遍历容器元素

cpp 复制代码
vector<int> v5;
	v5.push_back(1);
	v5.push_back(2);
	v5.push_back(3);
	vector<int>::iterator it = v5.begin();
	while (it != v5.end())
	{
		cout << *it << " ";
		it++;
	}

四、vector容器的常用算法

我们知道,容器可以用来存储数据,而算法就是对数据进行处理。通过容器也能能够访问其中存储的数据,所以我们可以通过容器来实现一些常用的算法。例如一些查找的算法、排序的算法。

4.1排序

例1:升序。

cpp 复制代码
//升序
int a[] = { 15,9,29,3,50 };
vector<int> v(a, a + 5);
sort(v.begin(), v.end());
//sort(v.rbegin(), v.rend());使用反向迭代器,此时为降序
for (auto e : v)
	cout << e << " ";
cout << endl;

例2:降序。

cpp 复制代码
greater<int> g;
sort(v.begin(), v.end(), g);
//sort(v.rbegin(), v.rend());使用反向迭代器,此时为升序
for (auto e : v)
	cout << e << " ";
cout << endl; 

降序这里我们其实没有必要传greater<int> g这个有名对象 ,这里完全可以用匿名对象 来实现。

sort(v.begin(), v.end(), greater<int>());

例3:对string类型的对象进行排序。

cpp 复制代码
string str("hello world");
sort(str.begin(), str.end());
cout << str << endl;

五、vector容量操作

5.1reserve

reserve函数用于预留一定的容量空间,以提高向vector中添加元素的效率。它通常在你知道vector将存储大量元素时使用,可以避免不必要的重新分配和复制元素。

这里有一点非常重要调用reserve函数不会改变vector的大小(即size()的返回值),只会影响vector的容量(即capacity()的返回值)。

错误案例演示

下面举一个错误案例

cpp 复制代码
//这是一个错误案例
vector<int> v1;
v1.reserve(10);
for (size_t i = 0; i < 10; i++)
{
	v1[i] = i;
}

v1[i] = i 中的[]操作会先对size进行检查,即assert(i < _size);。而上述代码中的size是0,执行完v1.reserve(10);之后只是改变了capacity,并不会对size进行改变。经过assert(i < _size);的检查之后当然会报错了。

但是如果我们依然要使用reserve的话,我们应该这样去使用,请看:

cpp 复制代码
vector<int> v;
v.reserve(10);
for (size_t i = 0; i < 10; i++)
{
	v.push_back(i);
	cout << v[i];
}

5.2resize

resize函数用于改变vector的大小(即改变size),可以增加或减少元素的数量。当增加大小时,新的元素会使用默认值进行初始化。

调用vector的resize函数会同时改变size和capacity

cpp 复制代码
vector<int> v1;
v1.resize(10);
for (size_t i = 0; i < 10; i++)
{
	v1[i] = i;
}

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


关于reserve函数和resize函数要时刻注意sizecapacity的变化。开辟了空间(capacity)后不一定可以对其内容进行访问,因为有时可能会对size的大小进行检查,比如[]

好了,以上就是本文的全部内容,主要对vector的一些基本语法和用法进行了介绍。
就到这里吧,再见啦友友们!!!

相关推荐
Monly215 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu6 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee20216 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
小俊俊的博客7 分钟前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机
7yewh8 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
waicsdn_haha20 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
_WndProc22 分钟前
C++ 日志输出
开发语言·c++·算法
薄荷故人_23 分钟前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
m0_7482400223 分钟前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome
qq_4335545431 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++