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类型使用需要的头 ...
随机推荐
- redis主从同步,总是显示master_link_status:down的解决方法
小编使用的redis的版本号是5.0.5,可能会略有不同,例如redis.conf配置文件中,没有slaveof这一项配置 使用命令配置主从复制 今天在使用命令slaveof或者是replicaof命 ...
- postgresql开篇
postgresql 作为官方号称的最先进的开源数据库,从今天(2020-1-19)起开始系统的学习一下,记录自己学习的点点滴滴.
- mysql官方源安装的一些问题
今天测试Linux 各个软件源 ,发现mysql 配置官方源之后,yum install -y mysql 安装了 mysql lastst 最新版, 安装完之后,奇葩的是没有提示输入密码, 所 ...
- PMP--1.2 PMBOK指南组成部分
图1.2.5 PMBOK指南关键组成部分在项目中的相互关系说明:项目生命周期中包含项目阶段,项目阶段结束之后就是阶段关口: 而项目管理过程和项目管理过程组以及项目管理知识领域都是为了项目生命周期服 ...
- 刷题79. Word Search
一.题目说明 题目79. Word Search,给定一个由字符组成的矩阵,从矩阵中查找一个字符串是否存在.可以连续横.纵找.不能重复使用,难度是Medium. 二.我的解答 惭愧,我写了很久总是有问 ...
- matlab 中 find() 函数用法
一. 功能: 寻找非零元素的索引和值 二.相关函数语法: ind = find(X) ind = find(X, k) ind = find(X, k, 'first') ind = find(X, ...
- 剑指offer-面试题55-平衡二叉树-递归
/* 题目: 判断二叉树是否为平衡二叉树. */ /* 思路: 判断二叉树的左子树和右子树高度相差是否为1. */ #include<iostream> #include<cstri ...
- SQL Server无法连接到服务器 标题: 连接到服务器 ------------------------------ 无法连接到 DESKTOP-J6I1UIC\SQLEXPRESS1。 ------------------------------ 其他信息: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。
解决方案: 打开 SQL server 配置管理器 选择 SQL server 服务,找到服务器,右键启动
- Uva1213(线性筛模板+dp)
题意: 把n拆成k个不同素数的和,有多少种拆法. 解法: 打表后dp即可,这个dp的问题可以归纳为:在n个数中选k个数,使得和m的方案数 #include<cstdio> #include ...
- C#排序算法的实现---选择排序
一.算法原理 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完. 选择排序算法的运作如下: 1.对比数组中前一个元素跟后一个元素的大小 ...