欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 深度学习c++资源库:vector容器,蓝桥杯常用算法sort,unique(排序+去重)

深度学习c++资源库:vector容器,蓝桥杯常用算法sort,unique(排序+去重)

2025/2/28 15:37:53 来源:https://blog.csdn.net/2401_87764997/article/details/145829999  浏览:    关键词:深度学习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;                  // 空的vectorvector<int> vec2(5);               // 长度为5的vector,元素默认初始化vector<int> vec3(5, 10);           // 长度为5的vector,元素值为10vector<int> vec4 = {1, 2, 3, 4};   // 使用初始化列表初始化return 0;
}

3.<vector>中常用的成员函数 

 下面是一个使用 <vector> 的简单示例:

#include <iostream>
#include <vector>
using namespace std;int main() {// 声明一个存储整数的 vectorvector<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;// 清空 vectornumbers.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>::iteratorvector<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算法,头文件 algorithmfor_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  容器。
 
 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词