C/C++算法编程竞赛标准模板库(STL)篇:向量/容器(vector)

本文详细介绍了C++中vector容器的定义、特性、常用函数如push_back(),pop_back(),insert(),以及如何进行排序和去重。作者旨在分享算法学习过程中的经验,帮助初学者理解并应用vector在编程中的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

这个栏目是对我算法学习过程的同步记录,我也希望能够通过这个专栏加深自己对编程的理解以及帮助到更多像我一样想从零学习算法并参加竞赛的同学。在这个专栏的文章中我会结合在编程过程中遇到的各种问题并提出相应的解决方案。当然,如果屏幕前的你有更好的想法或者发现的错误也欢迎交流和指出!不喜勿喷!不喜勿喷!不喜勿喷!那么事不宜迟,我们马上开始吧!

一、vector的定义和特性

1.基本介绍

2.vector对象的声明

3.vector对象的特性介绍

二、vector的常用函数

1.push_back()函数

2.pop_back()函数

3.insert()函数

三、vector排序去重

1.排序

2.去重

总结

我也从没想过STL中的vector还有这么多的花样。总而言之,如果你觉得这篇文章还不错,劳烦多多支持一下!码字不易,感谢你的观看!



前言

这个栏目是对我算法学习过程的同步记录,我也希望能够通过这个专栏加深自己对编程的理解以及帮助到更多像我一样想从零学习算法并参加竞赛的同学。在这个专栏的文章中我会结合在编程过程中遇到的各种问题并提出相应的解决方案。当然,如果屏幕前的你有更好的想法或者发现的错误也欢迎交流和指出!不喜勿喷!不喜勿喷!不喜勿喷!那么事不宜迟,我们马上开始吧!

一、vector的定义和特性

1.基本介绍

在C++中,vector是一个动态数组容器,可以存储一系列相同类型的元素,其是标准库<vector.h>头文件中定义的模板类

2.vector对象的声明

声明方式如下:

vector<int> vec;

3.vector对象的特性介绍

(1)容器大小:vector的本质是一个动态数组,可以根据需要自动调整大小。

(2)元素访问:可以通过索引(下标)访问。索引从0开始,到size(vec)-1结束。也可以使用[]运算符或at()函数来访问元素。但是一定要注意越界的问题!!一般我们在遍历时不会写i<=size(vec)-1,而是会写i<size(vec)。这是因为若vector为空,for循环内的判断条件越界(且能运行)导致出错。例如下面一串代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	vector<int> vec;
	for (int i = 0; i <= size(vec) - 1; ++i) cout << i << endl;
	return 0;
}

这串代码会不断输出i。而修改为i<size(vec)之后for循环语句块不会执行。

(3)元素的添加、删除和插入:push_back()函数、pop_back()函数、insert()函数,后面再介绍。

(4)容器大小管理:size()函数获取vector的大小;empty()函数检查vector是否为空;recize()函数调整vector的大小。

(5)迭代器:这里先简要介绍一下迭代器。迭代器的作用是用来访问容器(用来保存元素的数据结构)中的元素,所以使用迭代器,我们就可以访问容器中里面的元素。数组范围内的指针就是迭代器的一种。对于所有的迭代器,它们的使用方法和指针一样,比如自增(++)解引用(*)vector类型提供了迭代器,用于遍历容器中的元素。可以使用vec.begin()函数获取指向第一个元素的迭代器,使用vec.end()可以获取指向最后一个元素之后位置的迭代器。

二、vector的常用函数

1.push_back()函数

其作用为将元素添加到vector的末尾。

2.pop_back()函数

其作用为删除vector末尾的元素。 注意:一定要保证vector非空!!

3.insert()函数

起作用为将元素插入到指定的下标。

代码如下:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	vector<int> vec = {0,1,2,4,5,6,7};
	vec.insert(vec.begin()+3, 3);
	for (auto i : vec)cout << vec[i] << " ";
	return 0;
}

结果为:

0 1 2 3 4 5 6 7

三、vector排序去重

1.排序

要对vector进行排序,可以使用C++标准库中的sort()函数。该函数位于头文件<algorithm.h>中。sort()函数接受两个迭代器参数,表示要排序的范围。顺带提一嘴,如果要排序的是数组,就传入元素对应的指针即可。示例代码如下:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	vector<int> vec = {0,1,2,4,5,6,7};
	int arr[7] = {0,1,2,4,5,6,7};
	sort(vec.begin(), vec.end());
	sort(arr, arr + 7);
	cout << "vector: " << endl;
	for (auto i : vec)cout << vec[i] << " ";
	cout << "\narray:" << endl;
	for (int i = 0;i<size(arr);++i)cout << arr[i] << " ";
	return 0;
}

输出结果如下:

vector:
0 1 2 4 5 6 7
array:
0 1 2 4 5 6 7

2.去重

示例代码如下:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	vector<int> vec = { 2,1,3,2,4,1,5,4 };
	sort(vec.begin(),vec.end());
	auto last = unique(vec.begin(), vec.end());
	vec.erase(last, vec.end());
	for (const auto& i : vec)cout << i << " ";
	return 0;
}

结果为:

1 2 3 4 5

四、综合示例代码

示例代码如下:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	vector<int> vec = { 0,2,1,4,5,6,7 };
	
	cout << "before insert():";
	for (auto i : vec)cout << i << " ";
	cout << endl;
	vec.insert(vec.begin() + 3, 3);
	cout << "after insert():";
	for (auto i : vec)cout << i << " ";
	cout << endl;
	
	sort(vec.begin(),vec.end());
	cout << "after sort():";
	for (auto i : vec)cout << i << " ";
	cout << endl;
	
	vec.erase(vec.begin() + 4, vec.end());
	cout << "after erase():";
	for (auto i : vec)cout << i << " ";
	cout << endl;
	
	if (vec.empty())cout << "empty" << endl;
	else cout << "no empty" << endl;

	cout << "size: " << size(vec) << endl;

	vec.clear();

	if (vec.empty())cout << "empty" << endl;
	else cout << "no empty" << endl;

	return 0;
}

结果为:

before insert():0 2 1 4 5 6 7
after insert():0 2 1 3 4 5 6 7
after sort():0 1 2 3 4 5 6 7
after erase():0 1 2 3
no empty
size: 4
empty


总结

我也从没想过STL中的vector还有这么多的花样。总而言之,如果你觉得这篇文章还不错,劳烦多多支持一下!码字不易,感谢你的观看!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值