深度学习c++资源库:vector容器,蓝桥杯常用算法sort,unique(排序+去重)
vector容器
1.基本概念
<vector>
是 STL 中的一个容器类,不同于普通数组的静态空间,vector可以动态扩展。
动态扩展:并不是在原空间连接新空间,而是找到更大的内存空间,将原数据拷贝到新空间,释放原空间。
<vector>
是一个序列容器,它允许用户在容器的末尾快速地添加或删除元素。与数组相比,<vector>
提供了更多的功能,如自动调整大小、随机访问等。
2.声明与初始化
<vector>
需要指定元素类型,可通过多种方式进行初始化:
#include <iostream>
#include <vector>
using namespace std;
//声明vector容器
int main() {
vector<int> vec1; // 空的vector
vector<int> vec2(5); // 长度为5的vector,元素默认初始化
vector<int> vec3(5, 10); // 长度为5的vector,元素值为10
vector<int> vec4 = {1, 2, 3, 4}; // 使用初始化列表初始化
return 0;
}
3.<vector>中常用的成员函数
下面是一个使用 <vector>
的简单示例:
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 声明一个存储整数的 vector
vector<int> numbers;
// 添加元素
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
// 输出 vector 中的元素
cout << "Vector contains: ";
for (int i = 0; i < numbers.size(); ++i) {
cout << numbers[i] << " ";
}
cout << endl;
// 添加更多元素
numbers.push_back(40);
numbers.push_back(50);
// 再次输出 vector 中的元素
cout << "After adding more elements, vector contains: ";
for (int i = 0; i < numbers.size(); ++i) {
cout << numbers[i] << " ";
}
cout << endl;
// 访问特定元素
cout << "The first element is: " << numbers[0] << endl;
// 清空 vector
numbers.clear();
// 检查 vector 是否为空
if (numbers.empty()) {
cout << "The vector is now empty." << endl;
}
return 0;
}
4.三种遍历容器中元素的方式
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void Myprint(int val){
cout<<val<<endl;
}
void test1(){
vector<int> v;
//向容器中存放数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
//每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
//v.begin()返回迭代器,指向容器第一个元素
//v.end()返回迭代器,指向最末元素的下一个位置
//vector<int>::iterator
vector<int>::iterator pbegin=v.begin();
vector<int>::iterator pend=v.end();
//第一种遍历方法
while (pbegin != pend){
cout<<*pbegin<<endl;
pbegin++;
}
//第二种遍历方法
for(vector<int>::iterator it=v.begin();it!=v.end();it++){
cout<<*it<<endl;
}
//第三种遍历方法
//使用for_each算法,头文件 algorithm
for_each(v.begin(),v.end(),Myprint);
}
int main(){
test1();
return 0;
}
5.示例
-
基本操作
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};//声明vector容器,列表初始化
// 输出所有元素
cout << "Vector elements: ";
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}
cout << endl;
// 获取第一个和最后一个元素
cout << "First element: " << vec.front() << endl;
cout << "Last element: " << vec.back() << endl;
return 0;
}
-
容量大小
#include <iostream>
#include <vector>
using namespace std;
void printvector(vector<int> &v1){
for(vector<int>::iterator it=v1.begin();it!=v1.end();it++){
cout<<*it<<" ";
}
}
void test1(){
vector<int> v1;
for(int i=0;i<10;i++){
v1.push_back(i);
}
printvector(v1);
//判断容器是否为空
if(v1.empty()){
cout<<"v1为空"<<endl;
}
else{
cout<<"v1不为空"<<endl;
cout<<"v1的容量为"<<v1.capacity()<<endl;
cout<<"v1的大小为"<<v1.size()<<endl;
}
//重新指定大小
v1.resize(15);//如果重新指定的比原来长,默认用0填充。也可以指定默认填充值
printvector(v1);
v1.resize(5);//如果重新指定的比原来短,超出的部分删除掉
printvector(v1);
}
int main(){
test1();
return 0;
}
-
插入删除
#include <iostream>
#include <vector>
using namespace std;
//遍历容器中的元素
void printvector(vector<int> &v){
for(vector<int>::iterator it=v.begin();it!=v.end();it++){
cout<< *it <<" ";
}
cout<<endl;
}
void test1(){
vector<int>v;
//尾插插入元素
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
printvector(v);
//尾删
v.pop_back();
printvector(v);
//insert插入
v.insert(v.begin(),100);
printvector(v);
v.insert(v.begin(),2,100);
printvector(v);
//删除
v.erase(v.begin());
printvector(v);
}
int main(){
void test1();
return 0;
}
-
互换容器
#include <iostream>
#include <vector>
using namespace std;
void printvector(vector<int> &v){
for(vector<int>::iterator it=v.begin();it!=v.end();it++){
cout<< *it <<" ";
}
cout<<endl;
}
void test1(){
vector<int>v1;
for(int i=0;i<10;i++){
v1.push_back(i);
}
printvector(v1);
vector<int>v2;
for(int i=10;i>0;i--){
v2.push_back(i);
}
printvector(v2);
//互换
v1.swap(v2);
printvector(v1);
printvector(v2);
}
int main(){
test1();
return 0;
}
-
预留空间
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec;
vec.reserve(10); // 预留容量,避免频繁分配内存
for (int i = 0; i < 10; ++i) {
vec.push_back(i);
cout << "Capacity after push_back(" << i << "): " << vec.capacity() << endl;
}
return 0;
}
6.vector容器实战+蓝桥杯常用技巧排序,去重
#include <iostream>
#include <vector>
#include <algorithm> // 包含sort算法
using namespace std;
int main() {
vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6};
// 排序+去重(蓝桥杯常用技巧)
sort(nums.begin(), nums.end());
auto last = unique(nums.begin(), nums.end());
nums.erase(last, nums.end());
// 遍历输出(C++11范围for)
for (int num : nums) {
cout << num << " ";
}
return 0;
}
sort算法
sort(nums.begin(), nums.end()); :调用 sort 算法对 nums 容器中的元素进行排序。 排序后, nums 中的元素会按照升序排列。(sort函数会默认使用小于运算符<来确定元素的顺序。)
nums.begin() 返回指向容器第一个元素的迭代器, nums.end() 返回指向容器最后一个元素的下一个位置的迭代器。即左开右闭区间【nums.begin( ) , nums.end( ))
升序排列示例如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
// 对vector<int>进行排序
vector<int> nums = {5, 2, 8, 1, 9, 3, 7, 4, 6};
sort(nums.begin(), nums.end());
cout << "升序排序结果: ";
for (int num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}
降序排列示例如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool compare(int a, int b) {
return a > b; // 降序比较函数
}
int main() {
// 使用自定义比较函数进行降序排序
vector<int> nums2 = {5, 2, 8, 1, 9, 3, 7, 4, 6};
sort(nums2.begin(), nums2.end(), compare);
cout << "降序排序结果: ";
for (int num : nums2) {
cout << num << " ";
}
cout << endl;
return 0;
}
unique算法
C++中,unique() 函数用于去除容器或数组中相邻元素之间重复出现的元素。因此,在使用 unique() 函数之前,必须先对数组或容器进行排序。此外,unique() 函数的返回值是去重后序列的新末尾地址。
auto last = unique(nums.begin( ), nums.end( ) ); nums.begin( ) 返回指向容器第一个元素的迭代器, nums.end( ) 返回指向容器最后一个元素的下一个位置的迭代器。即左开右闭区间【nums.begin( ) , nums.end( ))
unique 算法会遍历这个区间,将相邻的重复元素中除了第一个之外的其他元素移动到序列的后面。它不会真正删除元素,而是返回一个迭代器,指向去重后新序列的逻辑末尾(即最后一个不重复元素的下一个位置)。在代码中,这个返回的迭代器被赋值给 last 。
例如,假设 nums 容器中的元素初始为 {3, 1, 2, 2, 3, 3, 1} ,排序后变为 {1, 1, 2, 2, 3, 3, 3} ,经过 unique 算法处理后,容器中的元素可能变为 {1, 2, 3, 2, 3, 3, 1} (其中 1 、 2 、 3 是不重复的元素,后面的 2 、 3 、 1 是原来重复的元素,但位置被移动了), last 迭代器指向 3 后面的那个 2 的位置。
nums.erase(last, nums.end()); 这行代码使用 erase 成员函数,根据 unique 算法返回的 last 迭代器,删除容器中超出新逻辑末尾的元素,真正实现了去重的效果。以上面的例子来说,执行完这行代码后, nums 容器中的元素就变为 {1, 2, 3} ,完成了对原始序列的去重操作。
for (元素类型 元素变量 : 容器或数组)
元素类型 是容器或数组中存储的元素的数据类型
元素变量 是一个临时变量,用于在每次循环迭代时存储容器或数组中的一个元素, 容器或数组是要遍历的对象。
它简化了对容器(如 vector 、 array 等)或数组中元素的遍历操作。在 for (int num : nums) 中, int 是 nums 容器中元素的类型(因为 nums 是 vector<int> 类型,存储的是整数), num 是一个临时变量,用于在每次循环中存储 nums 中的一个元素, nums 是要遍历的 vector 容器。