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_backpop_backvector还提供了很多其他的成员函数和迭代器,可以方便地访问和修改元素。比如,可以使用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;
}

vectorlist一样,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的第一个参数是要排序的容器的起始地址,第二个参数是要排序的容器的结束地址。这里使用了vectorbegin()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_boundupper_bound可以查找元素的下界和上界。

结论

本文介绍了C++ STL中的一些常用容器和算法,它们可以大大提高开发效率,开发者应该熟练掌握它们的使用。除了本文介绍的容器和算法,STL还提供了很多其他的容器和算法,可以根据具体的需求选择使用。在使用STL时,要注意容器和算法的复杂度,避免出现性能问题。

最后

为了方便其他设备和平台的小伙伴观看往期文章,链接奉上:

公众号搜索Let us Coding,或者扫描下方二维码,关注公众号,即可获取最新文章。

看完如果觉得有帮助,欢迎点赞、收藏关注

C++ STL 容器和算法:详解和实例演示的更多相关文章

  1. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  2. 《算法详解:C++11语言描述》已出版

    经过漫长的编写.修订和印刷过程,书籍<算法详解:C++11语言描述>终于出版了!目前本书已在各大电商平台上架,搜索书名即可找到对应商品.本书的特色在于: 介绍最新的C++11.C++14和 ...

  3. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  4. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

  5. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  6. [转] KMP算法详解

    转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的K ...

  7. 【转】AC算法详解

    原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...

  8. KMP算法详解(转自中学生OI写的。。ORZ!)

    KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...

  9. EM算法详解

    EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...

  10. Tarjan算法详解

    Tarjan算法详解 今天偶然发现了这个算法,看了好久,终于明白了一些表层的知识....在这里和大家分享一下... Tarjan算法是一个求解极大强联通子图的算法,相信这些东西大家都在网络上百度过了, ...

随机推荐

  1. Java 异常处理(2) : 异常处理的方式二:throws + 异常类型

    1 package com.bytezero.throwable; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 impor ...

  2. 【技术积累】MySQL优化及进阶

    MySql优化及进阶 一.MySQL体系结构 连接层:是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信 服务层:大多数的核心服务功能,如SQ ...

  3. vagrant 多个box的操作|共享目录失败

    本来机器上已经有一个Ubuntu的box了,今天想在安装一个centos的box,结果还折腾了很长时间. 多个机器的命令 添加box的时候需要使用名称,一个的时候可以忽略名称 vagrant box ...

  4. 修改主频 & 时钟树

    在system_stm32f10x.c中可以更改这个 最先调用void SystemInit (void)启动HSI+各种恢复缺省配置    然后   调用 SetSysClock();执行设置时钟7 ...

  5. 在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!

    写在开头 经过上几篇博文的学习,我们知道在Java中可以通过new Thread().start()创建一个线程,那今天我们就来思考另外一个问题:线程的终止 自然终止有两种情况: 1. 线程的任务执行 ...

  6. Android TextView设置某段文字可点击

    初次进入app,需要有个勾选隐私协议的UI,其中的隐私协议文字点击是可跳转到新页面对隐私协议机型展示 这里选择使用Android自带的SpannedString来设置TextView的文字内容即可设置 ...

  7. ubuntu切换root到user

    目前知道: 从root用户切回user用户有三种方法: 1.su user (user是你自己安装时候的用户名) 2.直接输入exit 3.ctrl+D组合键

  8. 【jQuery】(8)---jquery Ajax

    jquery ajax 一.AJAX 概述 1.什么是 AJAX? 特点 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使 ...

  9. 记一次由虚假唤醒产生的bug

    记一次由虚假唤醒产生的bug 用int a代表产品数量最少0最多10,有两个生产者,三个消费者,用多线程和条件变量模拟生产消费过程: #include <sys/types.h> #inc ...

  10. Bitmap优化详谈

    目录介绍 01.如何计算Bitmap占用内存 1.1 如何计算占用内存 1.2 上面方法计算内存对吗 1.3 一个像素占用多大内存 02.Bitmap常见四种颜色格式 2.1 什么是bitmap 2. ...