标准模板库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初学的更多相关文章

  1. C++ STL初学笔记

    C++  STL初学笔记 更系统的版本见徐本柱的PPT set 在这儿:http://www.cnblogs.com/pdev/p/4035020.html #include <vector&g ...

  2. #C++初学记录(STL容器以及迭代器)

    STL初步 提交ACM会TLE /仅以学习STL与迭代器使用 C. Cards Sorting time limit per test1 second memory limit per test256 ...

  3. 初学算法之最基础的stl队列

    简记为先进先出(first in first out) 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. 实用: #include <queue>//头 ...

  4. 带你深入理解STL之空间配置器(思维导图+源码)

    前不久把STL细看了一遍,由于看得太"认真",忘了做笔记,归纳和总结这步漏掉了.于是为了加深印象,打算重看一遍,并记录下来里面的一些实现细节.方便以后能较好的复习它. 以前在项目中 ...

  5. C++ STL中哈希表Map 与 hash_map 介绍

    0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...

  6. STL Vector使用

    http://blog.163.com/zhoumhan_0351/blog/static/399542272010225104536463 Vector 像一个快速的数组,其具有数组的快速索引方式. ...

  7. HDU-1263(STL+排序)

    水果 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  8. 学习:STL概念学习

    STL初识: 为了建立数据结构和算法的一套标准,诞生了STL STL基本概念: STL(Standard Template Library,标准模板库) STL 从广义上分为: 容器(containe ...

  9. 【C++】STL,vector容器操作

    C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...

随机推荐

  1. PMP--2. 项目启动前准备工作

    ####################################################### 概述:在第一章节的1.1-1.7中基本都是介绍的<PMBOK>的理论概念以及 ...

  2. Python爬虫实战教程:爬取网易新闻;爬虫精选 高手技巧

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. stars声明很多小伙伴学习Python过程中会遇到各种烦恼问题解决不了.为 ...

  3. 高级UI组件

    1.进度条 (1).圆形进度条(一般默认为圆形进度条) <ProgressBar android:layout_width="wrap_content" android:la ...

  4. Python 实现选择排序

    选择排序算法步骤: 找到数组中最小的那个元素中, 将它和数组的第一个元素交换位置, 在剩下的元素中找到最小的元素,将它和数组的第二个元素交换位置, 如此往复,知道将整个数组排序. 逐步分析: 假设一个 ...

  5. Swift -POP( 面向协议编程)与OOP(面向对象编程)

    面向协议编程(Protocol Oriented Programming,简称POP),是Swift的一种编程范式,Apple于2015年WWDC提出的,如果大家看Swift的标准库,就会看到大量PO ...

  6. exp导出含有双引号的表

    由于ORACLE默认的表名都是不区分大小写,在创建表时,在数据字典中存储的表名为大写.在有些情况下,如果创建的表在表名上加上双引号("),则创建的表其表名在数据字典中不作转换.比如 SQL& ...

  7. 视频会议系统MCU服务器视频传输处理模式

    视频会议系统MCU服务器视频传输处理模式 视频会议系统的组成主要包括终端.MCU服务器.网守等,其中的MCU服务器是整个系统的核心,视频会议系统的性能很大程度取决于MCU服务器的性能,因此MCU服务器 ...

  8. 二维数组 A[m][n] 按行优先和按列优先的 下标地址转换公式

    设二维数组 A[m][n] 按行优先存储, 每个元素占 p 个字节, 则 Loc(i, j) 的地址为 (i * n + m) * p, 第 i 行前面有 i 行, 每行有 n 个元素, 加上 第 i ...

  9. linux 异常 - setsebool: SELinux is disabled.

    问题描述 运行命令:setsebool httpd_can_network_connect 1 或者 setsebool httpd_can_network_connect_db 1 报错:setse ...

  10. day5 字典 dict

    数据类型划分:可变数据类型,不可变数据类型不可变数据类型:元组,数字,布尔,str, == 可哈希可变数据类型:list , dict, set == 不可哈希dict的 key 必须是不可变数据类型 ...