【AlgorithmTraining】06:STL容器使用与练习(上)

news2024/11/28 18:58:21

STL容器的使用与练习(上)


OVERVIEW

  • STL容器的使用与练习(上)
      • string类
      • 1.vector动态数组:
        • (1)vector动态一维数组:
        • (2)vector动态二维数组:
      • 2.deque双端队列:
      • 3.stack栈:
      • 4.queue队列:
        • (1)队列的基本使用:
        • (2)队列自定义类型:
      • 5.priority_queue优先队列
        • (1)大顶堆:
        • (2)小顶堆:
        • (3)队列自定义类型:运算符重载
        • (4)队列自定义类型:仿函数
      • 6.set集合:
        • (1)set的基本使用:
        • (2)set自定义类型:
      • 7.map键值对:
        • (1)map的基本使用:
        • (2)unordered_map:

STL六大组件:

  1. 容器
  2. 适配器
  3. 空间分配器:malloc
  4. 迭代器:高级指针
  5. 算法库:sort
  6. 仿函数:一个类重载一个括号

string类

string常用方法
find(what, start)
substr(start, length)
insert(start, what)
replace(start, length, what)
size()\length()

注意:find()返回值为第一个目标出现的下标值,若没有找到将返回string::npos(-1)

#include <iostream>
#include <string>
using namespace std;

int main(){
    string str = "ABCDEF";
    //1.输出字符串长度
    cout << str.size() << endl;
    //2.查找字符串DE的位置
    cout << str.find("DE") << endl;
    //3.输出没有查找到的结果
    cout << (int)str.find("DE", 5) << endl;
    //4.字符串截取
    cout << str.substr(3, 2) << endl;
    //5.字符串插入
    str.insert(1, "abc");
    cout << str << endl;
    //6.字符串替换
    str.replace(2, 5, "000");
    cout << str << endl;
    //7.一次性读入一行包含空格的字符串
    string str1;
    getline(cin, str1);
    cout << str1 << endl;
    
    return 0;
}

image-20210324231317375

1.vector动态数组:

vector常用方法说明
v.size()获取vector中元素数量
v.push_back(x)向vector末尾插入值为x的元素

(1)vector动态一维数组:

#include<iostream>
#include<vector>
using namespace std;

int main(){
    //初始化一个10个元素都为88的一维数组
    vector<int> v(10, 88);
    v.push_back(99);
    v.push_back(8);
    v.push_back(56);
    for(int i = 0; i < v.size(); ++i){
        cout << v[i] << "\n";
    }
    
    return 0;
}

image-20210324233018469

(2)vector动态二维数组:

#include<iostream>
#include<vector>
#include<string>
using namespace std;

int main(){
    //初始化一位10*10元素都为9的二维数组
    vector<vector<int> > v(10, vector<int>(10, 9));
    //(1)外层循环次数:v.size
    for(int i = 0; i < v.size(); ++i){
        //(2)内层循环次数:v[i].size
        for(int j = 0; j < v[i].size(); ++j){
            cout << v[i][j] << " ";
        }
        cout << endl;
    }
    
    return 0;
}

image-20210324233631692

2.deque双端队列:

deque常用方法
push_front()
pop_front()
push_back()
pop_back()
size()\empty()
#include<iostream>
#include<deque>
using namespace std;

int main(){
    deque<int> que;
    que.push_back(3);
    que.push_back(4);
    que.push_back(5);
    que.push_front(6);
    que.push_front(7);
    while(!que.empty()){
        cout << que.front() << " " << que.back() << endl;
        que.pop_back();
    }

    return 0;
}

image-20210325064116008

3.stack栈:

stack常用方法
push()
pop()
top()
empty()
size()
#include<iostream>
#include<stack>
using namespace std;

int main(){
    stack<string> sta;
    sta.push("1234567890");
    sta.push("abc");
    sta.push("909090");
    sta.push("T");
    cout << sta.size() << endl;
    cout << sta.top() << endl;
    while(!sta.empty()){
        cout << sta.top() << endl;
        sta.pop();
    }

    return 0;
}

image-20210325065113002

stack栈本质上不是容器属于适配器,是由双端队列进行二次封装得到

4.queue队列:

queue常用方法
push()
pop()
front()
back()
empty()
size()

(1)队列的基本使用:

#include<iostream>
#include<queue>
using namespace std;

int main(){
    queue<int> que;
    que.push(6);
    que.push(7);
    que.push(1);
    cout << que.size() << endl;
    while(!que.empty()){
        cout << que.front() << " " << que.back() << endl;
        que.pop();
    }
    return 0;
}

image-20210325070106508

queue队列本质上不是容器属于适配器,大部分情况下是由双端队列进行二次封装得到

(2)队列自定义类型:

#include<iostream>
#include<queue>
using namespace std;

struct node{
    int num, cnt;
};

int main(){
    queue<node> que;
    que.push((node){5, 6});
    que.push((node){1, 10});
    que.push((node){6, -1});
    cout << que.size() << endl;
    while(!que.empty()){
        cout << que.front().num << " " << que.front().cnt << endl;
        que.pop();
    }

    return 0;
}

image-20210326100215015

5.priority_queue优先队列

priority_queue常用方法
push()
pop()
top()
empty()
size()

priority_queue底层实现为堆,且建立后默认为大顶堆

(1)大顶堆:

#include<iostream>
#include<queue>
using namespace std;

int main(){
    priority_queue<int> que;
    que.push(5);
    que.push(9);
    que.push(-1);
    que.push(999);
    que.push(72);
    cout << que.size() << endl;
    while(!que.empty()){
        cout << que.top() << endl;
        que.pop();
    }
    
    return 0;
}

image-20210325071445002

(2)小顶堆:

#include<iostream>
#include<queue>
using namespace std;

int main(){
    /*
    priority_queue<int, vector<int>, greater<int> > que;
    priority_queue<类型(装的是什么), 容器(用什么装), 比较规则(greater<int>) > que;
    */
    priority_queue<int, vector<int>, greater<int> > que;
    que.push(5);
    que.push(9);
    que.push(-1);
    que.push(999);
    que.push(72);
    cout << que.size() << endl;
    while(!que.empty()){
        cout << que.top() << endl;
        que.pop();
    }
    
    return 0;
}

image-20210325071819938

(3)队列自定义类型:运算符重载

#include<iostream>
#include<queue>
using namespace std;

/*
	容器存储自定义类型必须重载小于号:
	bool operator< (const node &b)const{
        return this->num < b.num;    
    } 
*/

struct node{
    int num, cnt;
    bool operator< (const node &b)const{
        return this->num < b.num;    
    }
};

int main(){
    priority_queue<node> que;
    que.push((node){1, 2});
    que.push((node){4, -2});
    que.push((node){3, -9});
    cout << que.size() << endl;
    while(!que.empty()){
        cout << que.top().num << " " << que.top().cnt << endl;
        que.pop();
    }
    return 0;
}

image-20210325073815668

总结:自定义类型自定义输出顺序规则为按照第一个数字从大到小输出

(4)队列自定义类型:仿函数

#include<iostream>
#include<queue>
using namespace std;

struct node{
    int num, cnt;
};

/*
自定义仿函数:
struct func{
    bool operator() (const node &a, const node &b){
        return a.num < b.num;    
    }
};
*/

struct func{
    bool operator() (const node &a, const node &b){
        return a.num < b.num;    
    }
};

int main(){
    priority_queue<node, vector<node>, func> que;
    que.push((node){1, 2});
    que.push((node){4, -2});
    que.push((node){3, -9});
    cout << que.size() << endl;
    while(!que.empty()){
        cout << que.top().num << " " << que.top().cnt << endl;
        que.pop();
    }
    return 0;
}

image-20210327063621993

6.set集合:

set集合特点:

  1. 无重复元素
  2. 元素是有序的
  3. 插入、查找、删除操作的时间复杂度为log(N)

(1)set的基本使用:

#include<iostream>
#include<set>
using namespace std;

int main(){
    set<int> s;
    s.insert(7);
    s.insert(5);
    s.insert(99);
    s.insert(128);
    s.insert(-1);
    cout << s.size() << endl;
    if(s.count(128) == 1){
        cout << "YES" << endl;
    }else{
        cout << "NO" << endl;
    }
    s.erase(128);
    if(s.count(128) == 1){
        cout << "YES" << endl;
    }else{
        cout << "NO" << endl;
    }
    //迭代器遍历set集合中的元素
    for(auto it = s.begin(); it != s.end(); it++){
        cout << *it << endl; 
    }

    return 0;
}

image-20210327070410874

(2)set自定义类型:

#include<iostream>
#include<set>
using namespace std;

struct node{
    int num,cnt;
    bool operator< (const node &b)const {
        return this->num < b.num;
    }
};

int main(){
    set<node> s;
    s.insert((node){8, 9});
    s.insert((node){-99, 128});
    s.insert((node){2, 73});
    for(auto it = s.begin(); it != s.end(); it++){
        cout << it->num << " " << it->cnt << endl;
    }

    return 0;
}

image-20210327071248439

7.map键值对:

除了map中存储的为键值对,其他与set集合基本一致

(1)map的基本使用:

#include<iostream>
#include<map>
#include<string>
#include<utility>
using namespace std;

int main(){
    map<string, int> m;
    m.insert(make_pair("12345", 789));
    m.insert(make_pair("abcdefg", 111111));
    m.insert(make_pair("T", 99));
    if(m.count("abcdefg") == 1){
        cout << "YES" << endl;
        cout << m["abcdefg"] << endl;
    }else{
        cout << "NO" << endl;
    }
    m["999999"] = 56789;
    cout << m["999999"] << endl;
    
   	//使用count()查询与使用[]查询的区别
    m.erase("999999");
    cout << m.count("999999") << endl;
    cout << m["999999"] << endl;
    cout << m.count("999999") << endl;
    
	//遍历输出map中的键值对
    for(auto it = m.begin(); it != m.end(); it++){
        cout << it->first << " " << it->second << endl;
    }

    return 0;
}

image-20210327073908982

注意:在使用[]查询键值对时,若键值对不存在将自动创建,int类型将初始化值为0

(2)unordered_map:

#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;

int main(){
    unordered_map<string, int> m;
    m["1234567890"] = 67890;
    m["abcdefg"] = 12345;
    m["(+_+)"] = 666666;
    cout << m.size() << endl;
    for(auto it = m.begin(); it != m.end(); it++){
        cout << it->first << " " << it->second << endl;
    }
    return 0;
}

image-20210327080149728

注:对于无序map/set其内部的结构是一个哈希表(利用哈希查找函数),

  • 所以如果在unordered_map/set中使用自定义类型,就必须要自己手写哈希函数。
  • 在容器选择时,如果需要容器有序时才使用map/set,若无序有序则使用unordered_map/set以尽可能提升运行速度。

unordered_set

unordered_map

unordered_multiset

unordered_multimap

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VR全景旅游,成为数字文旅破局关键!

导语&#xff1a;VR全景技术是一种基于虚拟现实技术的全景图像显示技术&#xff0c;已经在各个领域得到广泛应用。在旅游业中&#xff0c;VR全景技术也越来越受到重视&#xff0c;并逐渐成为旅游业发展的重要趋势。本文将介绍VR全景技术在旅游业中的应用场景和价值&#xff0c;…

【嵌入式Linux内核驱动】02_字符设备驱动

字符设备驱动 〇、基本知识 设备驱动分类 &#xff08;按共性分类方便管理&#xff09; 1.字符设备驱动 字符设备指那些必须按字节流传输&#xff0c;以串行顺序依次进行访问的设备。它们是我们日常最常见的驱动了&#xff0c;像鼠标、键盘、打印机、触摸屏&#xff0c;还有…

MATLAB——信号的采样与恢复

**题目&#xff1a;**已知一个连续时间信号 其中&#xff1a;f01HZ&#xff0c;取最高有限带宽频率fm5f0。分别显示原连续时间信号波形和 3种情况下抽样信号的波形。并画出它们的幅频特性曲线&#xff0c;并对采样后的信号进行恢复。 step1.绘制出采样信号 这部分相对简单…

面试知识点梳理及相关面试题(十一)-- docker

1. Docker和虚拟机的区别 容器不需要捆绑一整套操作系统&#xff0c;它只需要满足软件运行的最小内核就行了。 传统虚拟机技术是虚拟出一整套硬件后&#xff0c;在其上运行一个完成操作系统&#xff0c;在该系统上再运行所需应用进程容器内的应用进程直接运行于宿主的内核&am…

TCP

TCP 流量控制 一般来说,我们希望数据传输的快一些,但如果对方把数据发送的过快,接收方就可能来不及接收,这就会造成数据的丢失 流量控制就是让发送方的发送速率不要太快,让接收方来得及接收 利用滑动窗口机制可以在TCP连接上实现对发送方的流量控制 TCP接收方利用自己的接收…

青岛OJ(QingdaoU/OnlineJudge)部署如何直连数据库批量修改

1.postgres数据库QingdaoU/OnlineJudge用的数据库是postgreSQL&#xff0c;一个关系型数据库。默认端口是5432&#xff0c;我们下载一个navcat 15以上的版本&#xff0c;用来连数据库。2.修改docker-compose.yml文件修改docker-compose.yml&#xff0c;手动添加一个端口&#x…

一三四——一六七

一三四、JavaScript——_DOM简介 MDNq前端参考文档&#xff1a;DOM 概述 - Web API 接口参考 | MDN (mozilla.org) 一三五、JavaScript——HelloWorld <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta h…

【JSON文件解析】JSON文件

文章目录概要&#xff1a;本期主要介绍Qt解析JSON数据格式文件的方式。一、JSON数据格式1.JSON类似于XML&#xff0c;在JSON文件中&#xff0c;有且只有一个根节点2.JSON有两种主流包含型构造字符&#xff1a;{对象}、[数组]3.JSON的值主要包括&#xff1a;对象、数组、数字、字…

你还在调戏AI,有的公司已经用ChatGPT开展业务了

近日&#xff0c;OpenAI 正式宣布开放 ChatGPT 和 Whisper 两个模型的 API&#xff0c;API 版本的ChatGPT 不仅功能更多、性能更强&#xff0c;而且还更便宜一一相当于目前 GPT-3 模型价格打一折!划重点OpenAl正式开放 ChatGPT 和 Whisper 模型的 API&#xff0c;目前 SnapChat…

运营商大数据的发展现状和趋势

互联网时代&#xff0c;流量困局始终是困扰企业的一大难题。信息杂&#xff0c;无效投入多&#xff0c;商业性营销色彩浓厚&#xff0c;都在企业和客户之间树立起一层层厚厚的障壁。选择优秀的营销手段&#xff0c;对于一个企业来说至关重要&#xff0c;反之&#xff0c;如若在…

[2.2.4]进程管理——FCFS、SJF、HRRN调度算法

文章目录第二章 进程管理FCFS、SJF、HRRN调度算法&#xff08;一&#xff09;先来先服务&#xff08;FCFS, First Come First Serve&#xff09;&#xff08;二&#xff09;短作业优先&#xff08;SJF, Shortest Job First&#xff09;对FCFS和SJF两种算法的思考&#xff08;三…

Go语言之条件判断循环语句(if-else、switch-case、for、goto、break、continue)

一、if-else条件判断语句 Go中的if-else条件判断语句跟C差不多。但是需要注意的是&#xff0c;Go中强制规定&#xff0c;关键字if和else之后的左边的花括号"{“必须和关键字在同一行&#xff0c;若使用了else if结构&#xff0c;则前段代码快的右花括号”}"必须和关…

Navicat连接centos7 mysql失败解决思路

Navicat连接centos7 mysql失败&#xff0c;可以从一下的几个问题进行逐个排查。1、远程登录权限查看远程登录权限root用户的host值为localhost时&#xff0c;说明只能进行本地登录&#xff0c;需要将host改为“%”&#xff1b;UPDATE mysql.user SET host % WHERE user root;…

Java -数据结构,Map Set

一、搜索 1.1、概念及场景 Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。以前常见的 搜索方式有&#xff1a; 直接遍历&#xff0c;时间复杂度为O(N)&#xff0c;元素如果比较多效率会非常慢二分查找&#xff0c;时间…

Mysql多数据库之间表简单同步

方案&#xff1a;触发器优点&#xff1a; 工作效率和开发效率上有很大的提高缺点&#xff1a; 增加数据库服务器的开销在同一个mysql实例中&#xff1a;在数据库sakila中创建insert触发器use sakila; mysql> delimiter $$ mysql> create trigger insert_trigger after in…

奇安信天眼系统——探针/分析平台部署及联动

奇安信天眼系统——探针/分析平台部署及联动一 概述二 探针/分析平台部署及联动流量传感器&#xff08;探针&#xff09;分析平台一 概述 奇安信天眼主要包括威胁情报、分析平台、传感器和文件威胁鉴定器四个模块组成。 一般仅需分析平台&#xff0c;流量传感器&#xff08;探…

MySQL专题(学会就毕业)

MySQL专题0.准备sql设计一张员工信息表&#xff0c;要求如下&#xff1a;编号&#xff08;纯数字&#xff09;员工工号 (字符串类型&#xff0c;长度不超过10位)员工姓名&#xff08;字符串类型&#xff0c;长度不超过10位&#xff09;性别&#xff08;男/女&#xff0c;存储一…

研讨会回顾 | Perforce发布数字资产管理工具Helix DAM,帮助您按时按预算交付虚拟产品

2023年2月28日&#xff0c;龙智联合全球领先的数字资产管理和DevSecOps工具厂商Perforce共同举办Perforce on Tour网络研讨会——“赋能‘大’研发&#xff0c;助力‘快’交付”。 研讨会上&#xff0c;Perforce解决方案工程师Kory Luo分享了Perforce版本控制软件Helix Core的产…

Transformer:Attention is All You Need

【Transformer论文逐段精读【论文精读】】 https://www.bilibili.com/video/BV1pu411o7BE/?share_sourcecopy_web&vd_source30e93e9c70e5a43ae75d42916063bc3b论文地址&#xff1a;[1706.03762] Attention Is All You Need (arxiv.org)Transformer第一个完全依靠自我注意来…

0-1背包问题(二维数组压缩为一维数组)

0-1背包不懂的&#xff0c;可以看这篇 https://donglin.blog.csdn.net/article/details/129412502 一维dp数组 对于背包问题其实状态都是可以压缩的。 在使用二维数组的时候&#xff0c;递推公式&#xff1a;dp[i][j] max(dp[i - 1][j], dp[i - 1][j - weight[i]] value[i]…