STL 标准模板库

news2024/10/6 8:28:16

以下是一些常用的STL容器:

  • vector:动态数组,提供快速的随机访问。
  • list:双向链表,支持快速插入和删除操作。
  • set:有序集合,存储唯一的元素。
  • map:有序映射,存储键值对。
  • stack:堆栈,先进后出(LIFO)的数据结构。
  • queue:队列,先进先出(FIFO)的数据结构。

算法

STL提供了丰富的算法库,包括排序、搜索、复制、替换、合并等各种常用算法。这些算法可以用于不同类型的容器,使得对数据进行各种操作变得简单高效。

以下是一些常用的STL算法:

  • sort:对容器进行排序。
  • find:在容器中查找指定元素。
  • copy:将容器中的元素复制到另一个容器。
  • replace:替换容器中的元素。
  • merge:合并两个有序容器。
  • reverse:反转容器中的元素顺序

vector(动态数组)

vector 是一个动态数组,提供了连续的内存空间用于存储元素。它是最常用的容器之一,支持快速随机访问和动态调整大小。

头文件

#include <vector>

创建容器对象

std::vector<T> vec;  // 创建一个空的 vector,元素类型为 T
std::vector<T> vec(n);  // 创建包含 n 个默认初始化的元素的 vector
std::vector<T> vec(n, value);  // 创建包含 n 个初始化为 value 的元素的 vector

vector<vector<Point2f> > points; //定义一个二维数组

常用成员函数

size():返回 vector 中的元素数量。
empty():检查 vector 是否为空。
push_back(value):在 vector 的末尾添加一个元素。
pop_back():删除 vector 的最后一个元素。
front():访问 vector 的第一个元素。
back():访问 vector 的最后一个元素。
clear():清空 vector 中的所有元素。
insert(position, value):在指定位置插入一个元素。
erase(position):删除指定位置的元素。
erase(begin, end):删除指定范围内的元素。

在c++11里,为for循环,添加一个container,它就会自动迭代:实现了对于vector型变量vec的内容打印,变量 i 遍历vector中的每一个元素,直到vector的结束

vector<int> vec;		//定义一个vector型变量vec的内容打印
vec.push_back(10);		//  向容器vec中添加10个元素
vec.push_back(20);		//再向容器vec中添加20个元素

for(int i:vec)
	cout << i << endl;

list(双向链表)

list 是一个双向链表,它支持高效的插入和删除操作,但不支持随机访问。它可以在任意位置进行元素的插入和删除,适用于需要频繁插入和删除操作的场景。

头文件

#include <list>

创建容器对象

std::list<T> lst;  // 创建一个空的 list,元素类型为 T
std::list<T> lst(n);  // 创建包含 n 个默认初始化的元素的 list
std::list<T> lst(n, value);  // 创建包含 n 个初始化为 value 的元素的 list

常用成员函数

size():返回 list 中的元素数量。
empty():检查 list 是否为空。
push_back(value):在 list 的末尾添加一个元素。
push_front(value):在 list 的开头添加一个元素。
pop_back():删除 list 的最后一个元素。
pop_front():删除 list 的第一个元素。
front():访问 list 的第一个元素。
back():访问 list 的最后一个元素。
clear():清空 list 中的所有元素。
insert(position, value):在指定位置插入一个元素。
erase(position):删除指定位置的元素。
erase(begin, end):删除指定范围内的元素。

#include <iostream>
#include <list>

int main() {
    std::list<int> lst;  // 创建一个空的 list

    lst.push_back(1);  // 在末尾添加元素
    lst.push_back(2);
    lst.push_front(0);  // 在开头添加元素

    std::cout << "List size: " << lst.size() << std::endl;  // 输出元素数量
    std::cout << "List elements: ";
    for (int num : lst) {
        std::cout << num << " ";  // 遍历并输出元素
    }
    std::cout << std::endl;

    lst.pop_back();  // 删除最后一个元素

    std::cout << "List size after pop_back(): " << lst.size() << std::endl;
    std::cout << "New list elements: ";
    for (int num : lst) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

map(关联容器)

map 是一个关联容器,它提供了一对一的键值对存储和访问功能。它基于红黑树

实现,具有自动排序的特性,键值对按键进行排序,并且可以快速地进行插入、删除和查找操作。

插入元素的键不允许重复,比较函数只对元素的键值进行

头文件

#include <map>

创建容器对象

std::map<Key, T> mp;  // 创建一个空的 map,键类型为 Key,值类型为 T
std::map<Key, T> mp(other);  // 创建另一个 map 的副本

常用成员函数

size():返回 map 中的键值对数量。
empty():检查 map 是否为空。
insert({key, value}):插入一个键值对到 map 中。
erase(key):删除指定键的键值对。
clear():清空 map 中的所有键值对。
find(key):查找指定键对应的迭代器。返回的是迭代器
begin():返回指向第一个键值对的迭代器。
end():返回指向最后一个键值对之后的迭代器。

coust(key):返回是否有键为key的元素,若有则返回1,若没有则返回0

pair是mp内部的存储结构,pair就是“一对”,第一个元素和第二个元素组成的一对,其中第一个元素叫做first,第二个元素叫second

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mp;  // 创建一个空的 map

    mp.insert({"Alice", 25});  // 插入键值对
    mp.insert({"Bob", 30});
    mp["Charlie"] = 35;  // 也可以使用索引操作符插入键值对

    std::cout << "Map size: " << mp.size() << std::endl;  // 输出键值对数量
    std::cout << "Map elements:" << std::endl;
    for (const auto& pair : mp) {
        std::cout << pair.first << ": " << pair.second << std::endl;  // 遍历并输出键值对
     
    }

    mp.erase("Bob");  // 删除指定键的键值对

    std::cout << "Map size after erase(): " << mp.size() << std::endl;
    std::cout << "New map elements:" << std::endl;
    for (const auto& pair : mp) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

注意:map会自动对键进行排序,从小到大排序

set(关联容器)

set 是一个关联容器,它存储唯一的元素,且自动按照键进行排序。set 的底层实现基于红黑树,具有快速的插入、删除和查找操作。

因此set可以进行去重和排序操作

头文件

#include <set>

创建容器对象

std::set<T> st;  // 创建一个空的 set,元素类型为 T
std::set<T> st(other);  // 创建另一个 set 的副本

常用成员函数

size():返回 set 中的元素数量。
empty():检查 set 是否为空。当set为空时,返回真
insert(value):向 set 中插入一个元素。
erase(value):删除 set 中指定的元素。
clear():清空 set 中的所有元素。
find(value):查找 set 中是否存在指定的元素。返回的是迭代器
begin():返回指向第一个元素的迭代器。
end():返回指向最后一个元素之后的迭代器。

cout(x): 统计set中,x的数量,因此要么返回1,要么返回0 

#include <iostream>
#include <set>

int main() {
    std::set<int> st;  // 创建一个空的 set

    st.insert(10);  // 插入元素
    st.insert(20);
    st.insert(30);

    std::cout << "Set size: " << st.size() << std::endl;  // 输出元素数量
    std::cout << "Set elements: ";
    for (int num : st) {
        std::cout << num << " ";  // 遍历并输出元素
    }
    std::cout << std::endl;

    st.erase(20);  // 删除指定元素

    std::cout << "Set size after erase(): " << st.size() << std::endl;
    std::cout << "New set elements: ";
    for (int num : st) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

unordered_set

底层是hash

引入头文件:

#include <unordered_set>

unordered_set 容器,可直译为“无序 set 容器”。即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。

unordered_set的几个特性:

创建容器对象

unordered_set<int> set1;

常用成员函数

size()函数,返回元素的数量

empty()函数——判断是否为空,若容器为空,则返回 true;否则 false

find()函数——查找,查找2,找到返回迭代器,失败返回end()

count(x)函数——出现次数,返回x出现的次数,0或1

insert()函数——插入元素

//插入元素,返回pair<unordered_set<int>::iterator, bool>
set1.insert(3);
//使用initializer_list插入元素
set1.insert({1,2,3});
//指定插入位置,如果位置正确会减少插入时间,返回指向插入元素的迭代器
set1.insert(set1.end(), 4);
//使用范围迭代器插入
set1.insert(set2.begin(), set2.end());

关于insert函数的返回值:
insert()只传入单个参数(待插入元素)

auto pr = words.insert("ninety"); 

emplace()函数——插入元素(转移构造)

//使用转移构造函数添加新元素3,比insert效率高
set1.emplace(3);

erase(x)函数——删除元素x

stack(适配器容器)

stack 是一个适配器容器,它提供了栈(先进后出)的行为。stack 内部使用其他容器作为其底层实现,默认情况下使用 deque 作为底层容器。

头文件

#include <stack>

创建容器对象

std::stack<T> stk;  // 创建一个空的 stack,元素类型为 T

常用成员函数

  • size():返回 stack 中的元素数量。
  • empty():检查 stack 是否为空。
  • push(value):将元素压入 stack。
  • pop():弹出 stack 的顶部元素。
  • top():返回 stack 的顶部元素的引用。
#include <iostream>
#include <stack>

int main() {
    std::stack<int> stk;  // 创建一个空的 stack

    stk.push(10);  // 将元素压入 stack
    stk.push(20);
    stk.push(30);

    std::cout << "Stack size: " << stk.size() << std::endl;  // 输出元素数量
    std::cout << "Stack top: " << stk.top() << std::endl;  // 输出栈顶元素

    stk.pop();  // 弹出栈顶元素

    std::cout << "Stack size after pop(): " << stk.size() << std::endl;
    std::cout << "New stack top: " << stk.top() << std::endl;

    return 0;
}

queue(适配器容器)

queue 是一个适配器容器,它提供了队列(先进先出)的行为。queue 内部使用其他容器作为其底层实现,默认情况下使用 deque 作为底层容器。

头文件

#include <queue>

创建容器对象

std::queue<T> que;  // 创建一个空的 queue,元素类型为 T

常用成员函数

size():返回 queue 中的元素数量。
empty():检查 queue 是否为空。
push(value):将元素加入到 queue 的末尾。
pop():移除 queue 的首个元素。
front():返回 queue 的首个元素的引用。
back():返回 queue 的末尾元素的引用。
 

#include <iostream>
#include <queue>

int main() {
    std::queue<int> que;  // 创建一个空的 queue

    que.push(10);  // 将元素加入到 queue 的末尾
    que.push(20);
    que.push(30);

    std::cout << "Queue size: " << que.size() << std::endl;  // 输出元素数量
    std::cout << "Queue front: " << que.front() << std::endl;  // 输出队首元素
    std::cout << "Queue back: " << que.back() << std::endl;  // 输出队尾元素

    que.pop();  // 移除队首元素

    std::cout << "Queue size after pop(): " << que.size() << std::endl;
    std::cout << "New queue front: " << que.front() << std::endl;

    return 0;
}

STL 算法

STL(标准模板库)提供了丰富的算法,用于在容器上执行各种操作。这些算法大大简化了对数据集合的处理,包括搜索、排序、转换等操作。

以下是一些常用的 STL 算法:

std::find():在容器中查找指定的元素。
std::sort():对容器中的元素进行排序。
std::reverse():反转容器中的元素顺序。
std::count():统计容器中某个值的出现次数。
std::accumulate():计算容器中元素的累加和。
std::transform():对容器中的元素应用一个操作,并将结果存储在另一个容器中。
std::copy():将一个容器中的元素复制到另一个容器中。
std::remove():从容器中删除指定的值。
std::unique():删除容器中的重复元素。
std::min_element():查找容器中的最小元素。
std::max_element():查找容器中的最大元素。

这些算法都是通过包含 <algorithm> 头文件来使用的。它们适用于不同类型的容器,包括数组、向量、列表、集合等。

下面是一个示例代码,演示了如何使用 STL 算法:

std::reverse()

算法用于反转容器中的元素顺序。

void reverse( BidirIt first, BidirIt last );
  • first 和 last:定义了容器中要进行反转的元素的范围。这个范围是一个双向迭代器可以在正向和反向方向上进行遍历。

下面是一个示例代码:

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

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};

    std::reverse(nums.begin(), nums.end());

    std::cout << "Reversed container: ";
    for (int num : nums) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

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

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

相关文章

数据库(MySQL)—— DQL语句(基本查询和条件查询)

数据库&#xff08;MySQL&#xff09;—— DQL语句&#xff08;基本查询和条件查询&#xff09; 什么是DQL语句基本查询查询多个字段字段设置别名去除重复记录 条件查询语法条件 我们今天进入MySQL的DQL语句的学习&#xff1a; 什么是DQL语句 MySQL中的DQL&#xff08;Data Q…

【Docker第一课】docker的基本命令和试启动容器(详细图解)

目录 知识梗概 docker的初步了解 了解docker常用命令 试开启容器&#xff08;这里演示nginx、python3和mysql&#xff09; 1、nginx容器的启动 2、python3容器的启动 docker的作用 虚拟机与容器的区别 写在前面&#xff1a; 本专栏你将了解docker一些入门知识&#xff…

【解决方案】Can‘t exec “locale”: No such file or directory

【解决方案】Cant exec “locale”: No such file or directory 还可能出现的错误&#xff1a; 1. 报错原因&#xff1a; 缺少ldconfig 2. 解决方案&#xff1a; sudo apt-get download libc-bin dpkg -x libc-bin*.deb unpackdir/ sudo cp unpackdir/sbin/ldconfig /sbin/ s…

机器学习:深入解析SVM的核心概念【三、核函数】

核函数 **问题一&#xff1a;为什么说是有限维就一定存在高维空间可分呢&#xff1f;**原始空间与特征空间为什么映射到高维空间可以实现可分核函数的作用 **问题二&#xff1a;最终怎么得到函数**从对偶问题到决策函数的步骤&#xff1a;结论 **问题三&#xff1a;为什么说特征…

Coursera: An Introduction to American Law 学习笔记 Week 04: Constitutional Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 04: Constitutional LawKey Constitutional Law TermsSup…

Golang chan 实现原理

Golang&#xff1a;context基于go1.22版本 chan的作用和使用方法共享内存的优缺点 chan 的使用方法 chanel 的底层结构channel 结构体创建channel写流程异常处理写时有阻塞读流程写时无阻塞读流程&#xff0c;缓冲区有空间写时无阻塞读流程&#xff0c;缓冲区无空间写流程整体架…

PC通过串口发送指令控制LED+串口中断

如何让单片机接收数据&#xff1f; 首先要打开SCON中的串行接收控制位REN。当REN1时为允许接收状态&#xff0c;可以接收信息。 因此令SCON 0x50&#xff1b; 怎么知道收到数据&#xff1f; 利用RI接收中断请求标志位。当串行接收到第8位结束时由内部硬件自动置为RI1&#…

Matlab各个版本介绍、区别分析及推荐

MATLAB&#xff0c;由美国MathWorks公司出品&#xff0c;是一款广泛应用的商业数学软件。自其诞生之初&#xff0c;MATLAB便以其强大的矩阵计算能力、灵活的编程环境以及广泛的应用领域&#xff0c;赢得了全球科研工作者和工程师的青睐。本文将详细介绍MATLAB的各个版本&#x…

基于springboot+vue+Mysql的学生毕业离校系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

牛客美团2024年春招第一场笔试【技术】解题

1.小美的平衡矩阵 小美拿到了一个n∗n的矩阵&#xff0c;其中每个元素是 0 或者 1。 小美认为一个矩形区域是完美的&#xff0c;当且仅当该区域内 0 的数量恰好等于 1 的数量。 现在&#xff0c;小美希望你回答有多少个i∗i的完美矩形区域。你需要回答1≤i≤n的所有答案 输出…

ArcGIS+ChatGPT双剑合璧:从数据读取到空间分析,一站式掌握GIS与AI融合的前沿科技!

目录 专题一 AI大模型应用 专题二 ArcGIS工作流程及功能 专题三 prompt的使用技巧 专题四 AI助力工作流程 专题五 AI助力数据读取 专题六 AI助力数据编辑与处理 专题七 AI助力空间分析 专题八 AI助力遥感分析 专题九 AI助力二次开发 专题十 AI助力科研绘图 专题十一…

chrome extension插件替换网络请求中的useragent

感觉Chrome商店中的插件不能很好的实现自己想要的效果,那么就来自己动手吧。 本文以百度为例: 一般来说网页请求如下: 当前使用的useragent是User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safar…

【模板】差分

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分模板。 b[0]a[0]; b[1]a[1]-a[0]; b[2]a[2]-a[1]; ...... b[n-1]a[n-1]-a[n-2]; b[n]a[n]-a[n-1]; 差分标记&#xff1a;b[l]k,b…

Springboot+mybatis升级版(Postman测试)

一、项目结构 1.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apach…

Vue3+ts(day05:ref、props、生命周期、hook)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…

生成gitee公钥

1、打开设置 2、设置SSH公钥 3、生成公钥 4、复制终端输出的公钥&#xff0c;放到这里&#xff0c;标题随便取。 5、测试 ssh -T gitgitee.com 最后用这个测试

Windows Server 安全策略配置

前言 Windows Server是由微软开发的一种操作系统&#xff0c;主要用于在企业或机构的服务器上运行。它提供了一系列的功能和工具&#xff0c;旨在提高服务器的性能、可靠性、安全性和管理性。 特点 强大的性能&#xff1a;Windows Server具有高度优化的内核和资源管理&#x…

测试腾讯云的高防CC抵御了攻击

网站需要安装防止CC攻击&#xff0c;因为CC攻击是一种常见的网络攻击&#xff0c;它会对网站造成严重的影响。 CC攻击&#xff08;Cybercrime Control&#xff09;是指向网站发起大量虚假请求的攻击&#xff0c;目的是使网站的资源耗尽&#xff0c;无法正常运行。CC攻击与DDoS…

QT上位机的学习

后面又该找工作了&#xff0c;这块的内容也需要好好学习&#xff01; QT 篇 QT上位机串口编程-CSDN博客 (1)可以通过安装虚拟串口来模拟串口通信的情况 发现我之前安装过&#xff08;9.0): 可以生成虚拟串口&#xff0c;无需实际硬件串口就可以实现同一台电脑上串口模拟通信…

【C语言的完结】:最后的测试题

看到这句话的时候证明&#xff1a; 此刻你我都在努力~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;语言的起点-----C语言 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹…