1 STL总览
类型 | 容器名称 | 扩展 |
---|---|---|
字符串 | string | |
动态数组 | vector | |
集合 | set (有序、去重) | multiset (有序、可重复) unorderd_set(无序、去重) |
关联容器 (键 - 值) |
map (一对一、键有序) | multimap (一对多) unordered_map (一对一、键无序) |
栈 | stack | |
队列 | queue | priority_queue (堆 / 优先队列:只能访问队首,即堆顶) dequeue (双端队列:首尾都可插删) |
2 string
2.1 方法
#include<string>
功能 | 方法 string str; |
说明 | 举例 |
---|---|---|---|
长度 | |||
str.length() | |||
str.size() | |||
插入 | |||
str.insert(pos, str2) | 在str[pos]处开始插str2 | ||
s tr.insert(it1, it2, it3) | it_:string::iterator 迭代器 在str的it1处插str2[it2,it3) |
||
删除 | |||
str.erase(pos, len) | 在str[pos]处开始 往后删,长度为len | ||
str.erase(it) | 删除it所指字符 | ||
str.erase(it1, it2) | 删除str[it1,it2) | ||
清空 | |||
str.clear() | |||
取子串 | |||
str.substr(pos, len) | 得到子串:str[pos]处开始,长度为len | ||
str.substr(pos) | 得到子串:str[pos]处开始,到str尾 | ||
查找 | |||
str.find(str2) | 从str[0]开始查找… | ||
str.find(str2, pos) | 从str[pos]开始查找 成功:返回str2[0]在str的位置(下标) 失败:返回string::npos |
if(str.find("a")!=string::npos){ //查找成功 } |
|
替换 | |||
str.replace(pos, len, str2) | 从str[pos]开始往后,长度为len的子串被替换为str2 | ||
str.replace(it1, it2, str2) | str[it1, it2)的子串被替换为str2 | str.replace(str.begin()+2, str.begin()+5,str2); |
|
字符数组和string的转换 | |||
str.c_str() | string转换为 常数 字符数组(不可变) | printf("%s\n",str1.c_str()); //string用printf输出 |
|
str = 字符数组 | 字符数组转换为string | char chs[5] = "abcd"; str = chs; |
|
string转换为int / double | |||
int = stoi(string) double = stod(string) |
|||
int / double转为string | #include<sstream> | int a; stringstream ss; ss<<a; string s = ss.str(); |
2.2 代码示例
#include<cstdio>
#include<string>
using namespace std;
int main(){
/*
初始化
*/
string str;
/*
遍历
*/
// 下标法
for(int i=0; i<str.length(); i++){
printf("%c",str[i]);
}
// 迭代器第 1 种
for(string::iterator it=str.begin(); it!=str.end(); it++){
printf("%c",*it);
}
// 迭代器第 2 种
string::iterator it=str.begin();
for(int i=0; i<str.length(); i++){
printf("%c",*(it+i)); // string/vector :可以it+i
}
return 0;
}
2.3 注意事项
(1)
存储字符串,C和C++(STL)的区别:
// c
char name[5] = "abcd"; //存储: 4个字符 + ‘\0’
// c++
string name = "abcd" //没有'\0',可存中文
(2)关于迭代器
只有string和vector才能用:下标访问
只有string和vector才能用:it+i
如:str.begin()+2
(str[2])、 str.end()-1
(str[str.length()-1],最后一个元素)
3 vector
3.1 方法
#include<vector>
功能 | 方法 vector vect; |
说明 | 举例 |
---|---|---|---|
长度 | |||
vect.size() | |||
插入 | |||
vect.push_back(x) | 最后位置插入元素x | ||
vect.insert(it, x) | 在迭代器 it 所指位置插入x | ||
删除 | |||
vect.pop_back() | 删除最后一个 | ||
vect.erase(it) | 删除vect[it] | ||
vect.erase(it1, it2) | 删除vect[it1, it2) | ||
清空 | |||
vect.clear() | |||
复制(深拷贝) | |||
初始化时 | vector<int> A; vector<int> B(A) |
||
vect.assign() | B.assign(A.begin(), A.end()); |
3.2 代码示例
#include<cstdio>
#include<vector>
using namespace std;
struct Student{
int age;
char name[10];
};
int main(){
/*
初始化
*/
// 一维数组
vector<int> vect1_1;
vector<int> vect1_2(10); //数组大小=10, 默认值vect[i]=0
vector<int> vect1_3(10,2); //数组大小=10, 默认值vect[i]=2
vector<Student> vect1_4;
// 二维数组
vector<vector<int> > vect2_1; //行列均不定
vector<vector<int> > vect2_2(3, vector<int>(10, 2)); //数组大小=3*10, 默认值vect[i]=2
vector<int> vect2_3[10]; //列固定
/*
遍历:一维,同string
*/
// 下标法
// 迭代器第 1 种
// 迭代器第 2 种
/*
遍历:二维
*/
// 下标法
for(int i=0; i