当前位置: 首页 > article >正文

深度学习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  容器。
 
 


http://www.kler.cn/a/561365.html

相关文章:

  • Linux运维——网络管理
  • [021-22].Redis的线程模型原理分析
  • self-attention部分代码注释
  • 清华大学DeepSeek文档下载,清华大学deepseek下载(完成版下载)
  • 在WINDOWS系统使用CMake gui编译NLopt配合VSCode使用
  • java项目之网络游戏交易系统源码(ssm+mysql)
  • 结构型模式 - 外观模式 (Facade)
  • 计算机毕业设计SpringBoot+Vue.js教学资源库(源码+文档+PPT+讲解)
  • labview实现有符号位16进制转二进制补码转真值
  • 每日一题-设计内存分配器;详细分析思路以及多解法
  • 企业业务安全进阶之路:AI技术与数据分析的应用
  • JavaWeb 学习笔记
  • 个人电脑小参数GPT预训练、SFT、RLHF、蒸馏、CoT、Lora过程实践——MiniMind图文版教程
  • linux--多进程开发基础(3) exec函数族
  • JavaWeb-GenericServlet源码分析(适配器/模板方法)
  • Sui 通过 SCION 推进网络安全与性能
  • Log | Hugo+PaperMod+Github创建自己的博客网站
  • 在ubuntu如何安装samba软件?
  • MongoDB03 - MongoDB索引,事务和安全
  • mac下载MAMP6.8.1