C++ STL 容器和算法:详解和实例演示
C++ STL(标准模板库)提供了一组丰富的容器和算法,使得开发者能够更加高效地编写程序。本文将介绍STL中的一些常用容器和算法。
容器
vector
vector是一个动态数组,可以在运行时调整大小。它的优点在于可以快速地访问元素,缺点是在插入和删除元素时需要移动后面的元素。
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
v.pop_back();
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
return 0;
}
除了push_back和pop_back,vector还提供了很多其他的成员函数和迭代器,可以方便地访问和修改元素。比如,可以使用v.front()和v.back()分别访问首元素和尾元素,使用v.insert()和v.erase()在任意位置插入和删除元素。此外,vector还提供了v.empty()和v.size()分别判断容器是否为空和获取容器大小。
list
list是一个双向链表,可以在任意位置插入和删除元素,但访问元素比较慢。
#include <list>
#include <iostream>
using namespace std;
int main() {
list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
cout << *it << " ";
}
cout << endl;
l.pop_back();
for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
cout << *it << " ";
}
cout << endl;
return 0;
}
和vector一样,list也提供了很多其他的成员函数和迭代器,可以方便地访问和修改元素。比如,可以使用l.front()和l.back()分别访问首元素和尾元素,使用l.insert()和l.erase()在任意位置插入和删除元素。此外,list还提供了l.empty()和l.size()分别判断容器是否为空和获取容器大小。
map
map是一个键值对容器,可以快速地根据键值查找对应的值。
#include <map>
#include <iostream>
using namespace std;
int main() {
map<string, int> m;
m["a"] = 1;
m["b"] = 2;
m["c"] = 3;
for (map<string, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << it->first << ":" << it->second << " ";
}
cout << endl;
m.erase("b");
for (map<string, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << it->first << ":" << it->second << " ";
}
cout << endl;
return 0;
}
和vector、list一样,map也提供了很多其他的成员函数和迭代器,可以方便地访问和修改元素。比如,可以使用m.find()查找元素,使用m.insert()插入元素,使用m.erase()删除元素。此外,map还提供了m.empty()和m.size()分别判断容器是否为空和获取容器大小。
算法
除了容器,STL还提供了一些常用的算法,可以方便地操作容器中的元素。
sort
sort是一个排序算法,可以快速地将数组或容器中的元素按照指定规则排序。
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v;
v.push_back(3);
v.push_back(2);
v.push_back(1);
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
return 0;
}
sort的第一个参数是要排序的容器的起始地址,第二个参数是要排序的容器的结束地址。这里使用了vector的begin()和end()函数获取迭代器,也可以使用数组名和数组长度作为参数。
sort默认是升序排序,可以通过第三个参数指定排序规则。比如,可以使用greater<int>()降序排序,使用less<int>()升序排序。
find
find是一个查找算法,可以快速地在数组或容器中查找指定元素。
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>::iterator it = find(v.begin(), v.end(), 2);
if (it != v.end()) {
cout << "found " << *it << endl;
} else {
cout << "not found" << endl;
}
return 0;
}
find的第一个参数是要查找的容器的起始地址,第二个参数是要查找的容器的结束地址,第三个参数是要查找的元素。find返回一个迭代器,指向第一个等于要查找元素的位置,如果没有找到则返回容器的结束地址。
除了find,STL还提供了很多其他的查找算法,比如find_if可以根据指定规则查找元素,binary_search可以判断容器中是否含有指定元素,lower_bound和upper_bound可以查找元素的下界和上界。
结论
本文介绍了C++ STL中的一些常用容器和算法,它们可以大大提高开发效率,开发者应该熟练掌握它们的使用。除了本文介绍的容器和算法,STL还提供了很多其他的容器和算法,可以根据具体的需求选择使用。在使用STL时,要注意容器和算法的复杂度,避免出现性能问题。
最后
为了方便其他设备和平台的小伙伴观看往期文章,链接奉上:
公众号搜索Let us Coding,或者扫描下方二维码,关注公众号,即可获取最新文章。
看完如果觉得有帮助,欢迎点赞、收藏和关注

C++ STL 容器和算法:详解和实例演示的更多相关文章
- C++中的STL中map用法详解(转)
原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解 Map是STL的一个关联容器,它提供 ...
- 《算法详解:C++11语言描述》已出版
经过漫长的编写.修订和印刷过程,书籍<算法详解:C++11语言描述>终于出版了!目前本书已在各大电商平台上架,搜索书名即可找到对应商品.本书的特色在于: 介绍最新的C++11.C++14和 ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- kmp算法详解
转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
- [转] KMP算法详解
转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的K ...
- 【转】AC算法详解
原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...
- KMP算法详解(转自中学生OI写的。。ORZ!)
KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...
- EM算法详解
EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...
- Tarjan算法详解
Tarjan算法详解 今天偶然发现了这个算法,看了好久,终于明白了一些表层的知识....在这里和大家分享一下... Tarjan算法是一个求解极大强联通子图的算法,相信这些东西大家都在网络上百度过了, ...
随机推荐
- 解读平台工程,DevOps真的死了吗?不,它只是换了个马甲而已,弥补了DevOps空心理论,让DevOps继续发展壮大
最**台工程这个概念越来越火爆,Gartner 的预测,到 2026 年,80% 的软件工程组织将拥有*台工程团队,来提供内部服务.组件和应用程序交付工具,作为可重复使用的资源.本篇文章将带你走进*台 ...
- ZYNQ SD卡 CDn管脚的作用
## 什么 是CDn? card detect, active low,用于指示当前SD卡是否插入,主机通过检测CD脚的状态来识别当前SD卡的状态. CD可以连接到MIO或者EMIO的任意空闲管脚,通 ...
- 第一百一十八篇: JavaScript 原型链式继承
好家伙,好家伙,本篇为<JS高级程序设计>第八章"对象.类与面向对象编程"学习笔记 1.原型链 原型链是JS实现"继承"的方案之一 ECMA-262 ...
- 微信小程序开发:页面分享卡片、风格选择、通道启用等可配置
上文说到,我们部署了定时任务,但是有个地方忘记在上文写了,这里补上,就是定时任务的超时时间问题,超时时间有7200秒: 我们改成7100秒: 再把云函数调用的云对象的超时时间也改下: 超时时间多一点, ...
- MVC阶段所有框架完整组合示例
思路:创建工程,导包.编辑配置文件包括 核心spring配置 SpringConfig myBatis 配置文件 mybatisConfig JdbcConfig jdbc.properti ...
- RocketMQ为什么这么快?我从源码中扒出了10个原因!
大家好,我是三友~~ RocketMQ作为阿里开源的消息中间件,深受广大开发者的喜爱 而这其中一个很重要原因就是,它处理消息和拉取消息的速度非常快 那么,问题来了,RocketMQ为什么这么快呢? 接 ...
- inner join on 1=1 在查询中的高级用法
最近在项目中看到一个查询语句,让我有兴趣去研究.研究.查询语句如下: 重点分析第二个INNER JOIN ON 1 = 1 这个语句:内连接表示查询两个表的交集,而且ON的条件为 1=1 就表示连接 ...
- 基于Apollo3 Blue MCU芯片的可穿戴产品解决方案开发之健康手环源码解析
一 前记 健康手环是Apollo3 Blue的一个主打业务,也是该芯片最适合做的产品,在健康穿戴设备领域,该芯片有着对场景的透彻理解和技术的深厚积累. 二 源码分析 协议栈初始化: exactle_s ...
- 引领文旅新体验!3DCAT实时云渲染助力打造“永不落幕”的湾区文采会元宇宙
2022年11月25日至27日,2022年粤港澳大湾区公共文化和旅游产品(东莞)采购会(简称"湾区文采会")在广东省东莞市文化馆举行. 文采会期间,文采会元宇宙线上虚拟展厅全新亮相 ...
- 记录--Vue3基于Grid布局简单实现一个瀑布流组件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在学习Grid布局之时,我发现其是CSS中的一种强大的布局方案,它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局 ...