常用STL总结【学习】

本文详述了C++ STL(标准模板库)的组件,包括向量、字符串、集合、映射、双端队列、链表、位集、堆栈、队列和优先队列。STL提供了容器、迭代器和算法,支持泛型编程,容器如vector和string具有内存管理功能,set和map基于红黑树实现高效检索。同时介绍了各种容器的插入、删除和遍历方法。
摘要由CSDN通过智能技术生成

STL

在ACM竞赛中,需要用到数组、字符串、队列、堆栈、链表、平衡二叉检索树等数据结构和排序、搜索等算法,以提高程序的时间、空间运行效率。

ANSI C++中包含了一个C++STL(Standard Template Library),即C++标准模板库,又称C++泛型库,它在std命名空间定义了常用的数据结构和算法,使用起来十分方便。

C++STL组件

STL提供三种类型的组件:容器、迭代器和算法。它们都支持泛型程序设计标准。

容器主要有两种:顺序容器和关联容器。顺序容器(vector、list、deque和string等)是一系列元素的有序集合。关联容器(set、multiset、map和multimap)包含查找元素的键值。

迭代器的作用是遍历容器。

STL算法库包含四类算法:排序算法、不可变序算法、变序性算法和数值算法。

vector向量容器

不但能像数组一样对元素进行随机访问,还能在尾部插入元素,完全可以替代数组。

值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间。

vector容器有两个重要的方法,begin()和end()。begin()返回的是首元素位置的迭代器;end()返回的是最后一个元素的下一元素位置的迭代器。

向量的元素类型可以是int,double,char等简单类型,也可以是结构体或string基本字符序列容器。

//创建一个具有10(n)个元素的向量容器对象,每个元素具有指定的(初始值)8.6。
vector<int> v(10,8.6);

//尾部元素扩张,vector容器会自动分配新内存空间。将2从尾部添加到v容器中。
v.push_back(2);

//常使用迭代器配合循环语句来对vector对象进行遍历访问,迭代器的类型一定要与它要遍历的vector对象的元素类型一致。
vector<int>::iterator it;//定义迭代器变量
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//输出迭代器上的元素值

//insert()方法可以在vector对象的任意位置前插入一个新的元素,同时vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置。
//要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标。
v.insert(v.begin(),8);//在最前面插入一个新元素,元素值为8
v.insert(v.end(),3);//在向量末尾追加一个新元素,元素值为3
v.insert(v.begin()+2,1);//在第二个元素前插入一个新元素,元素值为1

//元素的删除
//erase()方法可以删除vector中迭代器所指的一个元素或一段区间中的所有元素。
//clear()方法则一次性删除vector中的所有元素。
v.erase(v.begin()+2);//删除下标为2的元素
v.erase(v.begin()+1,v.begin()+5);//删除迭代器第1到第5区间的所有元素
v.clear();//清空向量

//算法均须定义头文件#include<algorithm>

//reverse反向排列算法,可将向量中某段迭代器区间元素反向排列
v.reverse(v.begin(),v.end());//反向排列向量的从首到尾间的元素

//sort算法要求使用随机访问迭代器进行排序,默认情况下对向量元素进行升序排序
//还可以自己设计排序比较算法,然后把这个函数指定给sort算法。sort(v.begin(),v,end(),Comp);
sort(v.begin(),v.end());//或者v.sort();

//向量的大小
//使用size()方法可以返回向量的大小即元素的个数。
//使用empty()方法返回向量是否为空,如果非空则返回逻辑假即0,否则返回逻辑真即1
v.size(); v.empty();

string基本字符系列容器

可以把string理解为字符串类,它提供了添加、删除、替换、查找和比较等丰富的方法。

虽然使用vector这样的向量也可以处理字符串,但功能比不上string。向量元素可以是string,如vector这样的向量,实际上就类似于C语言中的字符串数组。

string s; //创建字符串对象s,s是一个空字符串,其长度为0
cout<<s.length();

//给string对象赋值
s="hello,C++STL";//直接赋值
//更常用,将字符指针赋给一个字符串对象
string s;
char ss[5000];
scanf("%s",&ss);//scanf的输入速度比cin快得多且不支持string对象
s=ss;//把整个字符数组赋值给string对象

//从string对象尾部添加字符
s=s+'a';//尾部追加一个字符或字符串,采用'+'操作符即可
s=s+"abc";
s.append("abc");//采用append方法

//使用insert()方法把一个字符插入到迭代器位置之前
string s;
s="123456";
string::iterator it;
it=s.begin();
s.insert(it+1,'p');//把字符'p'插入到下标为1的字符前ÿ
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值