STL初学
标准模板库STL初学
|
线性数据结构 |
|
|
vector |
一维向量,相当于数组 |
|
list |
链表 |
|
map |
映射,提供(Key,Value)式操作,相当于哈希表 |
|
string |
char字符串 |
|
queue |
队列,先入先出的线性表 |
|
stack |
栈,先入后出的线性表 |
|
set |
集合 |
|
deque |
双向链表 |
一、vector:对数组的封装
|
push_back |
在尾部添加一个元素 |
|
pop_back |
从尾部删除一个元素(capacity不变) |
|
clear |
清空所有元素(capacity不变) |
|
at |
按索引访问某个位置的元素(操作符[]也被重载,可以用) |
|
front / back |
返回头/尾元素的引用 |
|
size |
返回元素个数 |
|
capacity |
返回当前容量 |
|
resize |
改变容量大小 |
|
insert |
在中间插入元素(与普通数组一样,涉及移动,效率低) |
|
erase |
删除中间的元素(与普通数组一样,涉及移动,效率低) |
在能确定最大容量时,应直接指定,避免反复申请缓冲区和复制大段数据。即创建时vector<int> arr(128)
迭代器iterator是vector的内部类,用于对vector内部的元素遍历。
vector<int>::iterator iter;
for(iter = arr.begin(); iter != arr.end(); iter++)
其中,*和->操作符被重载,可以直接使用。
二、list:对链表的封装
|
push_back |
在尾部添加一个元素 |
|
pop_back |
从尾部删除一个元素 |
|
push_front |
在首部添加一个元素 |
|
pop_front |
从首部删除一个元素 |
|
clear |
清空所有元素 |
|
front / back |
返回头/尾元素的引用 |
|
size |
返回元素个数 |
|
insert |
在中间插入元素(需要用迭代器遍历找到插入点) |
|
erase |
删除中间的元素(需要用迭代器遍历找到删除点) |
只进行push_back和pop_front,就相当于队列;只进行push_back和pop_back,就相当于栈。
三、string:对字符串的封装
内部仍然是维护一个char型数组,并且也是以0结尾。重载了许多操作符。
|
append |
附加字符串 |
|
clear |
清空 |
|
capacity |
容量 |
|
size / length |
两者相同,都返回实际长度 |
|
at |
按索引访问字符(与重载操作符[]等效) |
|
find |
查找一个字符或一个子串 |
|
rfind |
从后往前查找一个字符或一个子串 |
|
find_first_of |
查找匹配若干字符串中的一个字符 |
|
find_first_not_of |
查找不匹配若干字符串中的一个字符 |
|
find_last_of |
从后往前查找,匹配若干字符串中的一个字符 |
|
find_last_not_of |
从后往前查找,不匹配若干字符串中的一个字符 |
|
substr |
取得一个子串 |
|
insert |
插入字符或子串 |
|
replace |
替换字符或子串 |
构造对象:
string str("abc");
string str = "abc";
string str("abcde", );
string str;
string str = "";
可以用c_str函数来获取string内部的字符串指针:const char *str = str1.c_str();
传参时,使用const string& 或 string&(传引用),一般不使用string(传值)
附加字符串:(append函数和操作符)
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str;
str.append("abc"); //附加字符串
str.append("abcde",); //附加字符串前3个字符
str.append("abcde",,); //附加1-3个字符
str.append(,'h'); //附加2个h
cout << str << endl; //abcabcbcdhh
return ;
}
重载操作符 +=,+:如str += "abc";
和vector一样,当附加字符串时有可能会自动扩充缓冲区,并且需要复制原有数据。
字符串比较(重载了关系操作符):
string类重载了所有关系操作符(==, !=, >, >=, <, <=)。其概念与strcmp返回值相同。
字符串查找:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str = "LiMing is doing homework";
int pos1 = str.find('i'); //返回1
int pos2 = str.find('i',); //从位置2开始找,返回3
int pos3 = str.find("ing"); //返回3
int pos4 = str.find("ing",pos3+); //以po3+3=6开始往后找
int pos5 = str.rfind("ing"); //从右向左 返回12
int pos6 = str.rfind("ing",pos5-); //以pos5-3=9从右向左开始找,返回3
int pos7 = str.find_first_of("aeiouAEIOU"); //返回第一个元音字母的位置 1
int pos8 = str.find_first_not_of("aeiouAEIOU"); //返回第一个不是元音字母的位置 0
int pos9 = str.find_last_of("aeiouAEIOU"); //返回从右向左找第一个是元音字母的位置 21
int pos0 = str.find_last_not_of("aeiouAEIOU"); //返回从右向左找第一个不是元音字母的位置 23
return ;
}
复制子串(substr):
string str = "abcdefg";
string str1 = str.substr() //efg
string str2 = str.substr(,); //ef
插入和替换(低效):
// insert 的使用
string& insert(int pos, const char *str); //在pos处插入str
string& insert(int pos, const char *str, int count); //在pos处插入str[0,count-1]
string& insert(int pos, const char *str, int offset, int count); //在pos处插入str[offset,offset+count-1]
string& insert(int pos, int count, char ch); //插入若干字符 // replace 的使用,原串和用于替换的串的长度无关
string& replace(int pos, int num, const char *dest); //替换原字符串[pos,pos+num-1]
string& replace(int pos, int num, const char *dest, int count); //以dest[0,count-1]替换原字符串[pos,pos+num-1]
string& replace(int pos, int num, const char *dest, int offset, int count); //以dest[offset,offset+count-1]替换原字符串[pos,pos+num-1]
string& replace(int pos, int num, int count, char ch); //以count个ch替换原字符串[pos,pos+num-1]
四、二分(180208补充):
STL的二分函数返回值(迭代器)大概概括如下
1 3 3 5 9
lower_bound(3) -> a[1] -> 3
upper_bound(3) -> a[3] -> 5
STL初学的更多相关文章
- C++ STL初学笔记
C++ STL初学笔记 更系统的版本见徐本柱的PPT set 在这儿:http://www.cnblogs.com/pdev/p/4035020.html #include <vector&g ...
- #C++初学记录(STL容器以及迭代器)
STL初步 提交ACM会TLE /仅以学习STL与迭代器使用 C. Cards Sorting time limit per test1 second memory limit per test256 ...
- 初学算法之最基础的stl队列
简记为先进先出(first in first out) 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. 实用: #include <queue>//头 ...
- 带你深入理解STL之空间配置器(思维导图+源码)
前不久把STL细看了一遍,由于看得太"认真",忘了做笔记,归纳和总结这步漏掉了.于是为了加深印象,打算重看一遍,并记录下来里面的一些实现细节.方便以后能较好的复习它. 以前在项目中 ...
- C++ STL中哈希表Map 与 hash_map 介绍
0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...
- STL Vector使用
http://blog.163.com/zhoumhan_0351/blog/static/399542272010225104536463 Vector 像一个快速的数组,其具有数组的快速索引方式. ...
- HDU-1263(STL+排序)
水果 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
- 学习:STL概念学习
STL初识: 为了建立数据结构和算法的一套标准,诞生了STL STL基本概念: STL(Standard Template Library,标准模板库) STL 从广义上分为: 容器(containe ...
- 【C++】STL,vector容器操作
C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...
随机推荐
- python——面向对象(3),搬家具
"""date: 2020.2.9搬家具:将小于房子剩余面积的家具搬进房子1.定义家具类,房屋类""" class Furniture(): ...
- VUE中集成echarts时 getAttribute of null错误
错误 错误场景一: 错误提示: 在运行Vue项目时出现了上述错误,出现该错误的原因是Echarts的图形容器还未生成就对其进行了初始化所造成的,代码如下: // 基于准备好的dom,初始化echart ...
- Oracle修改用户Profile SESSIONS_PER_USER 限制
一.Profile目的: Oracle系统中的profile可以用来对用户所能使用的数据库资源进行限制,使用Create Profile命令创建一个Profile,用它来实现对数据库资源的限制使用,如 ...
- Docker 安装 ELK
安装 首先安装 Docker 与 Docker-Compose 相关的组件,我们这里直接使用准备好的 ELK 镜像,执行以下命令从 Dockerhub 上拉取指定版本的镜像,在本例当中我使用的是 7. ...
- js函数的使用+封装+代码复用
javascript 函数 return 后面没有返回值 代表提早退出语句,return后面的语句都不再执行 此时返回值为undefined <!DOCTYPE html> <htm ...
- SpringBoot项目自定义浏览器选项卡左上角图标(favicon.ico)-sunziren
favicon.ico是浏览器选项卡左上角的图标,可以放在静态资源路径下或者类路径下面.静态资源路径下的favicon.ico优先级高于类路径下的favicon.ico. 可以使用在线转换网站http ...
- Tomcat8.5安装与配置的坑
本文只是单纯记录一下tomcat配置的坑! 1.下载官网:https://tomcat.apache.org/下载后解压到根目录,盘符任意.但必须有jdk,本人用的是jdk1.8 2.配置环境变量在c ...
- [大数据技术]datax的安装以及使用
1.datax简述 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HBase.Ta ...
- 方法(定义、调用、重载)—Java
一. 什么是方法 不可能所有的功能都放到main中,需要定义其他方法完成指定功能,需要时调用方法即可 封装在一起来执行操作语句的集合,用来完成某个功能操作 封装在一起来执行操作语句的集合,用来完成某个 ...
- Windows资源管理器卡死(未响应)的解决办法
前几天笔记本出现一个莫名其妙的问题,不胜其扰,具体表现如下: A.打开资源管理器(我的电脑)时,会出现“正在处理它”的Loading提示,且地址栏会出现绿色进度条,进度条一般会持续几分钟(不影响进入分 ...