C++ STL容器和算法:详解和实例演示

C++ STL(标准模板库)提供了一组丰富的容器和算法,使得开发者能够更加高效地编写程序。本文将介绍STL中的一些常用容器和算法。

容器

vector

vector是一个动态数组,可以在运行时调整大小。它的优点在于可以快速地访问元素,缺点是在插入和删除元素时需要移动后面的元素。

1#include <vector> 2#include <iostream> 3 4using namespace std; 5 6int main() { 7 vector<int> v; 8 v.push_back(1); 9 v.push_back(2); 10 v.push_back(3); 11 12 for (int i = 0; i < v.size(); i++) { 13 cout << v[i] << " "; 14 } 15 cout << endl; 16 17 v.pop_back(); 18 19 for (int i = 0; i < v.size(); i++) { 20 cout << v[i] << " "; 21 } 22 cout << endl; 23 24 return 0; 25}

data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

除了push_backpop_backvector还提供了很多其他的成员函数和迭代器,可以方便地访问和修改元素。比如,可以使用v.front()v.back()分别访问首元素和尾元素,使用v.insert()v.erase()在任意位置插入和删除元素。此外,vector还提供了v.empty()v.size()分别判断容器是否为空和获取容器大小。

list

list是一个双向链表,可以在任意位置插入和删除元素,但访问元素比较慢。

1#include <list> 2#include <iostream> 3 4using namespace std; 5 6int main() { 7 list<int> l; 8 l.push_back(1); 9 l.push_back(2); 10 l.push_back(3); 11 12 for (list<int>::iterator it = l.begin(); it != l.end(); it++) { 13 cout << *it << " "; 14 } 15 cout << endl; 16 17 l.pop_back(); 18 19 for (list<int>::iterator it = l.begin(); it != l.end(); it++) { 20 cout << *it << " "; 21 } 22 cout << endl; 23 24 return 0; 25}

data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

vector一样,list也提供了很多其他的成员函数和迭代器,可以方便地访问和修改元素。比如,可以使用l.front()l.back()分别访问首元素和尾元素,使用l.insert()l.erase()在任意位置插入和删除元素。此外,list还提供了l.empty()l.size()分别判断容器是否为空和获取容器大小。

map

map是一个键值对容器,可以快速地根据键值查找对应的值。

1#include <map> 2#include <iostream> 3 4using namespace std; 5 6int main() { 7 map<string, int> m; 8 m["a"] = 1; 9 m["b"] = 2; 10 m["c"] = 3; 11 12 for (map<string, int>::iterator it = m.begin(); it != m.end(); it++) { 13 cout << it->first << ":" << it->second << " "; 14 } 15 cout << endl; 16 17 m.erase("b"); 18 19 for (map<string, int>::iterator it = m.begin(); it != m.end(); it++) { 20 cout << it->first << ":" << it->second << " "; 21 } 22 cout << endl; 23 24 return 0; 25}

data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

vectorlist一样,map也提供了很多其他的成员函数和迭代器,可以方便地访问和修改元素。比如,可以使用m.find()查找元素,使用m.insert()插入元素,使用m.erase()删除元素。此外,map还提供了m.empty()m.size()分别判断容器是否为空和获取容器大小。

算法

除了容器,STL还提供了一些常用的算法,可以方便地操作容器中的元素。

sort

sort是一个排序算法,可以快速地将数组或容器中的元素按照指定规则排序。

1#include <algorithm> 2#include <vector> 3#include <iostream> 4 5using namespace std; 6 7int main() { 8 vector<int> v; 9 v.push_back(3); 10 v.push_back(2); 11 v.push_back(1); 12 13 sort(v.begin(), v.end()); 14 15 for (int i = 0; i < v.size(); i++) { 16 cout << v[i] << " "; 17 } 18 cout << endl; 19 20 return 0; 21}

data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

sort的第一个参数是要排序的容器的起始地址,第二个参数是要排序的容器的结束地址。这里使用了vectorbegin()end()函数获取迭代器,也可以使用数组名和数组长度作为参数。

sort默认是升序排序,可以通过第三个参数指定排序规则。比如,可以使用greater<int>()降序排序,使用less<int>()升序排序。

find

find是一个查找算法,可以快速地在数组或容器中查找指定元素。

1#include <algorithm> 2#include <vector> 3#include <iostream> 4 5using namespace std; 6 7int main() { 8 vector<int> v; 9 v.push_back(1); 10 v.push_back(2); 11 v.push_back(3); 12 13 vector<int>::iterator it = find(v.begin(), v.end(), 2); 14 15 if (it != v.end()) { 16 cout << "found " << *it << endl; 17 } else { 18 cout << "not found" << endl; 19 } 20 21 return 0; 22}

data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

find的第一个参数是要查找的容器的起始地址,第二个参数是要查找的容器的结束地址,第三个参数是要查找的元素。find返回一个迭代器,指向第一个等于要查找元素的位置,如果没有找到则返回容器的结束地址。

除了find,STL还提供了很多其他的查找算法,比如find_if可以根据指定规则查找元素,binary_search可以判断容器中是否含有指定元素,lower_boundupper_bound可以查找元素的下界和上界。

结论

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

PPDB:今晚老齐直播

【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。

VBox 启动虚拟机失败

在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern

FLV文件格式

1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.