(蓝桥杯C/C++)——STL(上)

 

目录

一、vector

1.vector的定义和特性

2.vector的常用函数

3.vector排序去重

二、map

1.map

2.multimap

3.unordered_map

三、stack

1.stack的定义和结构

四、pair

1.pair的定义和结构

2.pair的嵌套

3.pair自带的排序规则


一、vector

1.vector的定义和特性

C++中,vector是一个动态数组容器,可以存储一系列相同类型的元素,它是标准库<vector>中定义的模板类。
vector的定义和结构非常简单,它由以下几个重要的部分组成:模板类声明:vector是一个模板类,因此在使用之前需要包含头文件<vector>。声明一个vector对象的通用语法如下:

std::vector<T> vec;

//这里的T是要存储在vector中的元素类型。

容器大小:vector是一个动态数组,可以根据需要自动调整大小。它会根据元素的数量动态分配内存空间。

元素访问:可以通过索引来访问vector中的元素。索引从0开始,最后一个元素的索引是size()1。可以使用[]运算符或at()函数来访问元素。

元素添加和删除:可以使用pushback()函数在vector的末尾添加元素,使用popback()函数删除末尾的元素。还可以使用insert()函数在指定位置插入元素,使用eraseO函数删除指定位置的元素。

容器大小管理:可以使用size()函数获取vector中元素的数量,使用empty()函数检查vector是否为空。还可以使用resize()函数调整vector的大小。

迭代器:vector提供了迭代器,可以用于遍历容器中的元素。可以使用begin0函数获一个元素的迭代器,使用end()函数获取指向最后一个元素之后位置的迭代器。

2.vector的常用函数

push back():将元素添加到vector的末尾。

void push_ back(const T& value);
 

pop_back():删除vector末尾的元素

void pop_back();

begin()和end():返回指向vector第一个元素和最后一个元素之后位置的迭代器。
示例:
vector<int> vec = {10, 20, 30};

for (auto it = vec begin(); it != vec.end(); ++it)

{
  cout << "it << " ";

}
 

3.vector排序去重

排序:

要对vector进行排序,可以使用标准库中的sort函数。该函数位于头文件<algorithm>中。

示例:

#include <algorithm>

std::vector<T> vec ={...};

std::sort(vec.begin(),vec.end());

这里的T是vector中元素的类型。

sort函数接受两个迭代器参数,表示要排序的范围。

vec.begin()返回指向vector第一个元素的迭代器

vec.end()返回指向最后一个元素之后位置的迭代器。

去重:要去除vector中的重复元素,可以使用std::unique函数。该函数位于头文件<algorithm>中

示例:

#include <algorithm>

std::vector<T> vec ={...};

std::sort(vec.begin(),vec.end());

auto last = std::unique(vec.begin(), vec.ebd());

vec.erase(last, vec.end());

首先,需要对vector进行排序,以便相同的元素相邻。然后,std::unique函数将重复的元素移动到vector的末尾,并返回一个指向不重复元素的迭代器。最后,可以使用vec.erase函数将重复元素从vector中删除

示例:
#include<iostream>

#include <vector>

#include <algorithm>

int main()

{
    std::vector<int> vec = {2,1,3,2,4,1,5,4);

    std::sort(vec,begin(),vec.end());

    auto last = std::unique(vec.begin(),vec.end());

     vec.erase(last, vec.end());
            for(const auto& num:vec)

                 {

                   std::cout << num<<” ";
                 }

     return 0;

}

输出:
12345

这样,vector中的重复元素被去除,只保留了不重复的元素,

二、map

1.map

map是一种关联容器,用于存储一组键值对(key-value pairs),其中每个键(key)都是唯一的。

map容器根据键来自动进行排序,并且可以通过键快速查找对应的值。map容器使用红黑树(Red-Black Tree)数据结构来实现,具有较快的插入、删除和査找操作的时间复杂度0(logn)。

map的定义和结构如下:

template < class Key, class T,class Compare = less<Key>,

                  class Allocator = allocator<pair<const Key, T>>>
          class map ;


Key: 表示存储在map中的键(key)的类型

T: 表示存储在map中的值(value)的类型:
Compare: 表示用于比较键的函数对象的类型,默认为less,使用键类型的默认比较函数

Allocator: 表示用于分配内存的分配器类型,默认为allocator。

函数
insert
erase
find
count
size
begin
end
clear
empty

lower_bound

upper_bound

功能
插入元素
删除元素
查找元素
统计元素个数
返回元素个数
返回指向容器起始位置的选代器
返回指向容器未尾位置的迭代器
清空容器
判断容器是否为空

返回指向第一个不小于指定键的元素位置
 返回指向第一个大于指定键的元素位置

时间复杂度
o(log n)
o(log n)
o(log n)
o(log n)
o(1)
o(1)
o(1)
o(n)
O(1)
o(log n)
o(log n)

2.multimap

multimap是一种关联容器,类似于map,但允许存储多个具有相同键的键值对

在实际做题过程中,multimap几乎用不到。

3.unordered_map

unordered_map是一种关联容器,用于存储一组键值对(key-value pairs),其中每个键(key)都是唯一的。与map和mwultimap不同,umordered_map不会根据键的顺序进行排序,而是使用哈希函数将键映射到存储桶中。这使得unordered_map具有更快的插入、删除和査找操作的时间复杂度,但不保证元素的顺序。

unordered map的定义和结构如下:
emplate <class Key,class T, class Hash = hash<Key>,

                class KeyEqual = equal_to<Key>,
                class Allocator  = allocator<pair<const Key, T>>>
class unordered map;

·Key:表示存储在unorderedmap中的键(key)的类型

·T:表示存储在unorderedmap中的值(value)的类型

·Hash:表示用于计算键的哈希值的函数对象的类型,默认为hash,使用键类型的默认哈希函数。

·KeyEqual:表示用于比较键的函数对象的类型,默认为equal_to,使用键类型的默认比较函数。

·Allocator:表示用于分配内存的分配器类型,默认为allocator。

函数
insert
erase
find
count
size
empty
clear
功能
插入元素
删除元素
查找元素
计数指定键的元素个数
返回元素个数
判断容器是否为空
清空容器
平均时间复杂度
0(1)
o(1)
0(1)
0(1)
0(1)
0(1)
0(1)
最坏时间复杂度簣浗頑还
0(n)
0(m)
0(m)
0(m)
0(1)
0(1)
o(n)

unordered map拥有极好的平均时间复杂度和极差的最坏时间复杂度,所以他的时间复杂度是不稳定的。

一般情况下我们更愿意使用复杂度稳定的map而不是unordered map.

三、stack

1.stack的定义和结构

stack是一种后进先出(LIF0)的数据结构,使用前需要包含头文件<stack>。stack提供了一组函数来操作和访问元素,但它的功能相对较简单。stack的定义和结构如下:

template<class T, class Container = deque<T>>

              class stack;
 

template<class T,class (ontainer = deque<T>>

              class stack;
 

T: 表示存储在stack中的元素的类型。
 

Container: 表示底层容器的类型,默认为deque。也可以使用其他容器类型,如vector或list。
stack的内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素。

函数
push(x)
pop()
top()

empty()

size()

描述
在栈顶插入元素 x
弹出栈顶元素
返回栈顶元素

检查栈是否为空
empty()检查栈是否为空

时间复杂度
0(1)
0(1)
o(1)
0(1)

0(1)

四、pair

1.pair的定义和结构

在C++中,pair是一个模板类,用于表示一对值的组合。它位于<utility>头文件中。

pair类的定义如下:

template<class T1, class T2>

struct pair

{

    T1 first;          // 第一个值
    T2 second;    // 第二个值

//构造函数      

   pair();

         pair(const T1&  x, const T2&  y);

     //比较运算符重载

        bool operator == (const pair& rhs)const;

        bool operator != (const pair& rhs)const;
}

pair类模板有两个模板参数,T1和T2,分别表示第一个值和第二个值的类型。


pair类有两个成员变量,first和second,分别表示第一个值和第二个值。


pair类还有一些成员函数和特性,例如默认构造函数、带参数的构造函数、比较运算符重载等。


使用pair类,你可以方便地将两个值组合在一起,并进行传递、存储和操作。


例如,可以将两个整数组合在一起作为回值,或者将一对值存储在容器中。

下面是一些使用pair的示例:

#include<iostream>

#include <utility>

int main()

{

        std::pair<int, double> p1(1, 3.14);

        std: :pair<char, std::string> p2('a', "hello");


        std: :cout << p1.first <<“,"<<p1.second << std::endl;

        std::cout << p2.first<<","<<p2.second << std: :endl;
         

     return 0;

}
以上代码创建了两个pair对象,分别包含不同类型的值。然后,通过访问first和second成员变量,输出了这些值

2.pair的嵌套

pair可以进行嵌套,也就是说可以将一个pair对象作为另一个pair对象的成员。通过嵌套pair,你可以方便地组合多个值,并形成更复杂的数据结构。

例如,你可以创建一个三维坐标系的点,其中第1个维度由一个整数表示,第2、3个维度由一个pair表示。

下面是一个示例代码,演示了如何嵌套使用pair:

#include <utility>

#include<iostream>


      int main()

   {

     std::pair <int, int> p1(1, 2);

     std::pair <int, std::pair <int, int> > p2(3,  std:: make_pair(4, 5));

     std::pair <std::pair <int, int>, std::pair <int, int> >> p3( std:: make_pair(6, 7), std:: make_pair);
 

    std::cout << p1.first << ", " << p1.second << std:: endl;

    std::cout << p2.first << ", " << p2.second.first << ", "  << p2.second.second << std:: endl;

    std::cout << p3.first .first<< ", " << p3.first. second << ", "  << p3.second. first << " " <<std::            endl;

    return 0;

}

在这个示例中,我们创建了三个pair对象:p1、p2和p3。

·P1是一个简单的pair,包含两个整数值。

·p2是一个嵌套的pair,其中第一个值是一个整数,第二个值是一个pair,其中包含两个整数

·p3是一个嵌套的pair,其中每个值都是一个pair,每个pair包含两个整数值。通过访问嵌套的pair对象的成员变量,我们可以获取到相应的值。

3.pair自带的排序规则

pair自带的排序规则是按照first成员进行升序排序。

如果first成员相等,则按照second成员进行升序排序这意味着当你使用标准库中的排序算法(如std::sort)对包含pair对象的容器进行排序时,会根据pair对象的first成员进行排序。

下面是一个示例代码,演示了如何使用pai进行排序:

#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>

     int main()

   {
     std::vector<std::pair<int, int>> vec
     vec.push back(std::make_pair(3,2));
     vec.push back(std::nake pair(1, 4))
     vec.push back(std::mgke pair(2,1));


    std::sort(vec.begin(), vec.end());

         for(const auto& p : vec)

        {
             std::cout << p.first<<","<< p.second << std: :endl;

        }
     return  0;

}


在这个示例中,我们创建了一个存储pair对象的向量vec,其中包含三个pair对象。然后,我们使用std::sort函数对vec进行排序。由于pair对象的排序规则是按照first成员进行升序排序,所以排序后的结果

           

14
21
32


最后,我们通过遍历vec并输出每个pair对象的成员,验证了排序结果。需要注意的是,如果你想按照其他排序规则对pair进行排序,可以自定义比较函数或使用lambda表达式来传递给排序算法。这样,你可以根据自己的需求定义排序规则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904816.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

定高与不定高虚拟列表

前言 在日常代码开发过程中&#xff0c;总会遇到大数据量的问题&#xff0c;当我们需要加载显示几千上万的数据的时候&#xff0c;如果我们是一次性渲染&#xff0c;那肯定就会出现严重的卡顿现象&#xff0c;这对用户体验是非常差的&#xff0c;也会让我们的项目&#xff0c;可…

基于全景图像拼接算法

图像拼接简介图像拼接的主要步骤摄像机运动的投影模型&#xff08; projective model)图像的对齐 (registration)图像的合成 (blending)图像拼接试验 什么是图像拼接&#xff1f; 将多幅在不同时刻、从不同视角或者由不同传感器获得的图像经过对齐然后无缝地融合在一起&#xf…

二十二、MySQL 8.0 主从复制原理分析与实战

文章目录 一、复制&#xff08;Replication&#xff09;1、什么是复制2、复制的方式3、复制的数据同步类型3.1、异步复制3.2、半同步复制3.3、设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的 4、基于binlog位点同步的主从复制原理4.1、异步复制示例…

MFC工控项目实例二十七添加产品参数

承接专栏《MFC工控项目实例二十六创建数据库》 在型号参数界面添加三个参数试验时间、最小值、最大值。变量为double m_edit_time; double m_edit_min; double m_edit_max; 1、在SEAL_PRESSURE.h中添加代码 class CProductPara { public:union{struct{...double m_edit_min;…

java:入门基础(1)

练习一&#xff1a;文字版格斗游戏 需求: ​ 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人物的时候&#xff08;new对象的时候&#xff09;&#xff0c;这些信息就应该被确定下来。 举例&#xff1a; ​ 程序运行之后…

Spring Boot Configuration和AutoConfiguration加载逻辑和加载顺序调整

在spring中&#xff0c; AutoConfiguration也是一个种Configuration&#xff0c;只是AutoConfiguration是不能使用proxy的。 而且spring对于两者的加载顺序也不是一视同仁&#xff0c;是有顺序的。spring会先加载SpringBootApplication可达的且标注了Configuration的类&#x…

第二十三章 Vue组件通信之非父子组件通信

目录 一、引言 1.1. event bus 事件总线 1.1.1. 实现步骤 1.2. provide & inject 1.2.1. 实现步骤 二、event bus事件总线完整代码 2.1. 工程结构图 ​2.2. main.js 2.3. App.vue 2.4. EventBus.js 2.5. BaseC.vue 2.6. BaseB.vue 2.7. BaseA.vue 三、provi…

AI代币是什么?AI与Web3结合的未来方向在哪里?

近两年随着人工智能的崛起&#xff0c;AI已经渗透到制造业、电商、广告、医药等各个行业&#xff0c;加密货币领域也不例外&#xff0c;人工智能与区块链的融合&#xff0c;让我们看到了独特的数字资产 — AI加密代币。 它的流行始于2022年底&#xff0c;随着OpenAI智能聊天机…

java_封装

基本介绍 面向对象编程有三大特征&#xff1a;封装、继承和多态。 封装介绍 封装的理解和好处 封装的实现步骤&#xff08;三步&#xff09; 案例 package com.hspedu.encap;public class Encapsulation01 {public static void main(String[] args) {// 如果要使用快捷键altr…

爬虫+数据保存2

爬取数据保存到MySQL数据库 这篇文章, 我们来讲解如何将我们爬虫爬取到的数据, 进行保存, 而且是把数据保存到MySQL数据库的方式去保存。 目录 1.使用pymysql连接数据库并执行插入数据sql代码(insert) 2.优化pymysql数据库连接以及插入功能代码 3.爬取双色球网站的数据并保…

物理模拟:OpenVDB数据与游戏引擎的结合使用

目录 OpenVDB简介 VDB&#xff08;Voxel Data Base&#xff09;存储结构 距离场&#xff08;SDF&#xff09;和密度场&#xff08;Density&#xff09; VDB格式特点 VDB应用案例 1. 网格运算 2.Ray Marching算法优化 3.模型转流体 PBRT V4 OpenVDB在Unreal Engine中的…

Java8中CompletableFuture.allOf的使用

目录标题 CompletableFuture.allOf(...)&#xff1b;CompletableFuture.allOf(...).get();CompletableFuture.allOf(...).join();总结如何优雅的处理异常呢&#xff1f; CompletableFuture.allOf(…)&#xff1b; CompletableFuture.allOf(…) 本身不会等待所有的 Completable…

VBA语言専攻介绍20241031

VBA语言専攻简介 在当今世界&#xff0c;几乎没有任何工作是没有计算机的。有些工作需要定期重复相同的过程&#xff0c;最好将它们自动化。一旦任务自动化&#xff0c;只需单击一个按钮即可运行。VBA是实现自动化工作的最为简单的方式&#xff0c;它不需要其他工具&#xff0…

OpenCV视觉分析之目标跟踪(6)轻量级目标跟踪器类TrackerNano的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 Nano 跟踪器是一个超轻量级的基于深度神经网络&#xff08;DNN&#xff09;的通用目标跟踪器。 由于特殊的模型结构&#xff0c;Nano 跟踪器速度…

Python小游戏17——飞机大战

运行结果 首先&#xff0c;你需要安装Pygame库。如果你还没有安装它&#xff0c;可以使用以下命令来安装&#xff1a; bash pip install pygame 代码&#xff1a; python import pygame import random # 初始化Pygame pygame.init() # 屏幕大小 SCREEN_WIDTH 800 SCREEN_HEIGH…

Java 基本语法与语言环境(1/30)

目录 Java 基本语法与语言环境 1. Java 语言环境搭建 1.1 安装 JDK 1.2 配置系统变量 配置步骤&#xff08;Windows 系统&#xff09; 2. Hello World 程序 2.1 代码解析 2.2 编译与运行 3. Java 程序结构 4. 基本语法规则 4.1 标识符与关键字 4.2 数据类型与变量 …

开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一个开发的聊天应用与AI开发框架&#xff0c;集成 ChatGPT&#xff0c;支持私有部署的源码。 介绍 当前系统集成了ChatGPT的聊天应用&#xff0c;不仅提供了基本的即时通讯功能&#xff0c;还引入了先进的AI技术&#x…

LSTM——长短期记忆神经网络

目录 1.LSTM 工作原理 2.LSTM的代码实现 3.代码详解 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;用于解决长序列中的长期依赖问题。它通过引入门机制&#xff0c;控制信息的流入、保留和输出&…

大数据新视界 -- 大数据大厂之优化大数据计算框架 Tez 的实践指南

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

dedecms手机搜索不跳转手机页面模板的解决方法

1.找到文件plus/search.php&#xff0c;添加如下代码并保存 $mobile (isset($mobile) && is_numeric($mobile)) ? $mobile : 0; if ( $mobile1 ) {define(DEDEMOB, Y); } 2.来到网站后台&#xff0c;默认模板管理&#xff0c;新建模板 将手机端列表页面的.html文件&…