2018-02-23

C++ STL

这是我学习标准模板整理的一些知识点

vector常见用法

vector 翻译为向量,是一种可以容纳同类型元素的容器,也可以理解为“长度根据需要而自动改变的数组”。要使用 vector ,需要添加以下两行: 

#include  

using namespace std;

1. vector定义

vector name;

2. vector容器内元素的访问

通过下标访问 

对于一个定义为 vector vi 的 vector 容器来说,使用 vi[index] 访问即可,下标是从 0 到 vi.size()-1

通过迭代器访问 

迭代器可以理解为一种 复杂的指针,定义是 vector::iterator it;,可以通过 *it 来访问 vector 里的元素 

vi[i] 和 *(vi.begin()+i) 是等价的,所以可以通过以下这种方式访问容器内的元素 

C++ 

vector::iterator it = vi.begin(); 

printf("%d", *(it + i)); 

迭代器还实现了两种自加操作:++it 和 it++ (自减操作同理),于是有另一种遍历vector中元素的写法,注意 end() 并不是取vi的尾元素地址,而是取尾元素地址的下一个地址 

C++ 

//vector的迭代器不支持it < vi.end()的写法,因此循环条件只能用it != vi.end() 

for(vector::iterator it = vi.begin(); it != vi.end(); it++) 

printf("%d ", *it); 

注意,在常用 STL 容器中,只有在 vector 和 string 中,才允许使用 vi.begin() + 3 这种迭代器加上整数的写法

3. vector常用函数解析

push_back() 

push_back(x) 即在 vector 后面添加一个元素 x,时间复杂度 O(1) ,如 vi.push_back(x)

pop_back() 

用以删除 vector 的尾元素,时间复杂度 O(1)

size() 

用来获得 vector 中元素的个数,时间复杂度 O(1) 。size() 返回的是 unsigned 类型,一般来说用 %d 不会有很大问题,比如 printf("%d\n", vi.size());

clear() 

用来清空 vector 中所有元素,时间复杂度 O(N)

insert() 

insert(it, x) 用来向 vector 的任意迭代器 it 处插入一个元素 x ,时间复杂度 O(N)

erase() 

erase(it) 即删除迭代器为 it 处的元素

erase(first, last) 即删除 [first, last) 内的所有元素

4. vector的常见用途

本身可以作为数组使用,在一些元素个数不确定的场合可以很好节省空间

在需要按一定格式输出数量不确定的数据时

实现邻接表储存图

set常见用法

set翻译为集合,是一个 内部自动有序 (递增排序) 且 不含重复元素 的容器。要使用 set ,需要添加以下两行: 

#include  

using namespace std;

1. set定义

set name;

2. set容器内元素的访问

set 只能通过迭代器访问 

set::iterator it; 

由于除开 vector 和 string 之外的 STL 容器都不支持 *(it + i) 的访问方式,因此只能如下枚举: 

C++ 

for(set::iterator it = st.begin(); it != st.end(); it++) 

printf("%d ", *it); 

3. set常用函数解析

insert() 

insert(x) 可将 x 插入 set 容器中,并自动递增排序和去重,时间复杂度 O(logN)

find() 

find(value) 返回 set 中对应值为 value 的迭代器,时间复杂度 O(logN) ,如 

set::iterator it = st.find(2);

erase() 

erase(it) 删除迭代器为 it 处的元素

erase(value) 删除值为 value 的元素

erase(first, last) 删除 [first, last) 内的所有元素

size() 

size() 用来获得 set 内元素的个数, 时间复杂度 O(1)

clear() 

clear() 用来清空 set 中的所有元素,复杂度 O(N)

4. set常见用途

set 最主要的作用是自动去重并按升序排列,因此遇到需要去重但不方便直接开数组的情况,可以尝试用 set 解决 

- set 中元素是唯一的,需要处理不为一的情况,需要使用 multiset 。另外,C++ 11 标准中还增加了 unordered_set ,以散列代替 set 内的红黑树,可以用来处理只去重不排序的需求,速度比 set 快得多

string常见用法

string对字符串常用的功能进行了封装,要使用 string ,需要添加以下两行: 

#include  

using namespace std;

1. string定义

与基本数据类型相同,在 string 后跟上变量名即可: 

string str;

初始化可直接对变量赋值 

string str = "abcd";

2. string中内容的访问

通过下标访问 

C++ 

string str = "abcd"; 

for(int i = 0; i < str.length(); i++) 

printf("%c", str[i]); 

如果要读入和输出整个字符串,则只能用 cin 和 cout

通过迭代器访问 

C++ 

string str = "abcd"; 

for(string:iterator it = str.begin(); it != str.end(); it++) 

printf("%c", *it); 

string 和 vector 一样,支持直接对迭代器加减某个数字,如 str.begin() + 3 的写法是可行的

3. string 常用函数解析

operator += 

string 的加法,可以直接将两个 string 拼接起来 

str3 = str1 + str2; 

str1 += str2;

compare operator 

两个 string 类型可以直接用 ==、!=、<、<=、>、>= 比较大小,比较规则是 字典序

length()/size() 

前者返回 string 的长度,即存放的字符数,后者与前者基本相同

insert() 

string 的 insert() 有很多种写法,下面给出几个常用的写法,时间复杂度 O(N) 

insert(pos, string) ,在 pos 位置插入字符串 string

insert(it, it2, it3) , it 为原字符串的欲插入位置,it2 和 it3 为待插字符串的首尾迭代器,用来表示字符串 [it2, it3) 将被插在 it 的位置上

erase() 

str.erase(it) 用于删除单个元素,it 为需要删除的元素的迭代器

str.erase(first, last) 删除一个区间内的所有元素,即为删除 [first, last)

str.erase(pos, length) 其中 pos 为需要开始删除的起始位置,length 为删除的字符个数

clear() 

用于清空 string 中的数据,时间复杂度一般为 O(1)

substr(pos, len) 返回从 pos 位开始,长度为 len 的子串,时间复杂度为 O(len)

string::npos 

string::npos 是一个常数,用以作为 find 函数失配时的返回值,其本身的值为 -1 ,但由于时 unsigned_int 类型,因此实际上也可以认为是 unsigned_int 类型的最大值 4294967295

find() 

str.find(str2) 当 str2 是 str 的子串时,返回其在 str 中第一次出现的位置;如果不是,返回 string::npos

str.find(str2, pos) 从 str 的 pos 号位开始匹配 str2 ,返回值与上相同,时间复杂度 O(mn) ,其中 n 和 m 分别为 str 和 str2 的长度

replace() 

str.replace(pos, len, str2) 把 str 从 pos 位开始,长度为 len 的子串替换为 str2

str.replace(it1, it2, str2) 把 str 的迭代器 [it1, it2) 范围的子串替换为 str2

map常见用法

map 翻译为映射,可以将任何基本类型(包括 STL 容器)映射到任何基本类型(包括 STL 容器)。要使用 map ,需要添加以下两行: 

#include  

using namespace std;

1. map定义

map mp; 

- <> 内两个类型前者是键的类型,后者是值的类型 

- 如果是字符串到整型的映射,必须使用 string 而不能用 char 数组

2. map容器内元素的访问

通过下标访问 

例如对一个定义为 map mp 的 map 来说,可以直接使用 mp['c'] 的方式来访问对应的整数,注意,map 中的键值是唯一的

通过迭代器访问 

map 迭代器定义与其他 STL 容器相同 

map::iterator it;

map 使用 it->first 访问键,使用 it->second 访问值

map 会以键从小到大的顺序自动排序

3. map常用函数解析

find() 

find(key) 返回键为 key 的映射的迭代器,时间复杂度 O(logN)

erase() 

mp.erase(it) ,删除单个元素,it 为需要删除的元素的迭代器,时间复杂度 O(1)

mp.erase(key) ,删除单个元素, key 为欲删除的映射的键,时间复杂度 O(logN)

mp.erase(first, last) 删除区间 [first, last) 内元素

size() 

用来获取 map 中映射的数量,时间复杂度为 O(1)

clear() 

用来清空 map 中的所有元素,复杂度 O(N)

4. map常见用途

需要建立字符(或字符串)与整数之间映射的情境,使用 map 可以减少代码量

判断大整数或者其他类型数据是否存在的情况,可以把 map 当 bool 数组用

字符串和字符串的映射可能也会用到

map 的键和值是唯一的,如果一个键需要对应多个值,就只能用 multimap 。C++ 11 中还增加了 unordered_map,以散列代替 map 内部的红黑树实现,使其可以用来处理只映射而不按 key 排序的需求,速度比 map 快得多

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容