STL库常用容器和方法总结

139 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

STL的基本概念

  • STL(Standard Template Library,标准模板库)
  • STL从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator)
  • 容器和算法之间通过迭代器进行无缝连接
  • STL几乎所有的代码都采用了类模板或者函数模板

常用容器和方法特性:

一.string库函数
1.字符串和整形或其他类型转换( 只适用于字符串string)

	引入头文件 #include<sstream>
	创建流:   stringstream  ss;
	整数转字符串:ss<<n; ss>>str;
	字符串转整数:ss<<str;ss>>n;  
        注意使用完后    ss.clear()关闭流        


2.字符串拼接 直接**+
3.reverse(s.begin() ,s.end() ) //字符串逆序
4.找子串:
.substr(index,len) 第
index**个位置(从0开始数)起长度为length的子串
.find(‘‘)或find("")找字符或字符串在字符中出现的位置
.find(’’,3)从下标3开始查起
.find_first_of(’’)和.find_last_of() 查找第一此出现和最后一次出现字符’‘的位置
5.字符串插入:
s1.insert(2, “123”); //在下标 2 处插入字符串"123"
s1.insert(3, s2); //在下标 2 处插入 s2
s1.insert(3, 5, ‘X’); //在下标 3 处插入 5 个 ‘X’
6.字符串删除: .erase(index) 删除下标index之后的所有字符 .erase(1,3)删除下标1后面长度为3的字符串
二.STL库
1.vector:可用来看成动态数组,里面可以存入任何类型的数据,包括结构体。特点:可以向数组一样直接访问。
2. list:封装好的链表
两者常见共有操作:
两者都没有自带的find函数,可借用算法库自带的find(起始地址,终止地址,值)实现

 .push_back() //尾部插入 		.pop_back()//尾部删除
    .front()//第一个元素的引用 		.back()//最后一个元素的引用
    .insert()//在指定位置插入一个或多个元素 .erase()//删除指定位置的一个或一段元素  	.empty()//判断容器是否为空   		.size()//返回容器元素个数 	.swap() //交换两个容器中的所有元素     

.clear()//清空容器中所有元素


list特有操作:

.push_front()//头部插入 .pop_front()//头部删除 .sort()
//排序(无法用算法库里的sort函数) .splice()//将一个list容器中的元素插到另一个容器的指定位置 .merge()
//合并两个事先已排序的list容器,并且合并之后仍然有序 .remove(val) //删除容器中所有等于val的元素
.remove_if() //删除容器中满足条件的元素 .unique()//删除容器中相邻的重复元素(一般排好序再使用) .reverse()//反转容器中元素的顺序

  1. stack:封装好的栈 //stack和queue无迭代器 只能.push()//进 .pop()//出
  2. queue:封装好的队列 //可以用链表或vector 模拟栈和队列

集合
**set:**自动排好序的集合,不允许有相同元素。
**multiset:**自动排好序的集合,允许有相同元素。
两者常见共有操作

.find(val)//查找值为val的元素并返回所在迭代器位置,查找不到则返回 .end();
.empty()//判断容器是否为空 .size()//返回容器元素个数
.swap() //交换两个容器中的所有元素 .clear()//清空容器中所有元素
.insert()//向容器中插入元素并默认排好序,注意:如果是set,容器里含有待插元素时,此操作相当于不执行
.count(val)//查找集合里值为val的元素个数并返回,一般set里用来判断是否存在值为val的元素

映射:
**map:**每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的。不允许有多个元素的关键字相同。
**multimap:**和 map 类似,差别在于元素的关键字可以相同。
默认升序,若想降序:map<string,int,greater>
两者常见共有操作: 访问方式:迭代器->first,迭代器->second //分别访问关键字和值

.find(key)//查找关键字为key的元素并返回所在位置的迭代器
.empty()//判断容器是否为空 .size()//返回容器元素个数
.swap() //交换两个容器中的所有元素 .clear()//清空容器中所有元素
.insert(pair<string,int>(str,int)) //插入键值对
.erase(key) //删除关键字为key的键值对 .erase(position) //删除迭代器position位置处的键值对
.count(key) //查找映射里关键字为val的元素的键值对个数并返回,一般map里用来判断是否存在值为val的键值对

注意:
**不能修改 set 或 multiset 容器中元素的值。因为元素被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,
再在其上进行查找等操作就会得到错误的结果。**因此,如果要修改 set 或 multiset 容器中某个元素的值,正确的做法是:
先删除该元素,再插入新元素。

同理,也不能修改 map 和 multimap 容器中元素的关键字,但是能修改后面的值(方式:迭代器->second=新的值)。