STL

目录: - vector - map - string - pair

前言:

博主在写蓝桥杯算法题目的时候发现大部分时间并不是如何构思算法的设置,大部分时间反而是浪费在了检查数据类型的初始化,以及东拼西凑stl的代码,来完成特定的任务,让博主感到很不舒服。于是决定写一篇stl的使用笔记,方便以后查阅。


数组的初始化问题

C++ 标准要求数组的长度必须是编译期已知的常量表达式 > 例如:int a[10]; 是合法的,int a[n]; 是不合法的


vector

vector 是连续的顺序的储存结构(和数组一样的类别),但是有长度可变的特性 而且vector是存在堆 不会出现暴栈的情况,因为是动态分配,更节省内存 能提前制定长度就提前制定长度

1
2
3
4
5
6
7
//初始化
vector<int> a; // 空的vector
vector<int> a(10); // 10个元素的vector
vector<int> a(10, 0); // 10个元素的vector,初始值为0

vector<vector<int>> mat(100,vector<int>());//100rows 不指明列
vector<vector<int>> mat(100,vector<int>(10,-1));//100rows 10column and -1 init all num
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//常用操作
//1.遍历读入
for(int i=0;i<N;i++){
int tmp;
cin>>tmp;
arr.push_back(tmp);
}
//常用
arr[3]//访问第四个,索引同样以0开始
arr.size()//读取长度
arr.empty()//检查是否为空
arr.resize(10);//延长为10,超过原始长度的部分自动为0
arr.begin();
arr.end();
sort(arr.begin(),arr.end());//对vector排序

map

提供对数时间的有序键值对结构。底层原理是红黑树。一个键只会出现一次

map<键类型, 值类型, 比较器> mp

1
2
3
4
5
6
7
8
9
10
//初始化
map <int,int> mp;//int->vec 的映射(键从小到大)
map <int, vector <int> ,greater<int> > mp1//int->vec的映射(键从大到小)
//输入匹配,清晰明了
map<int, vector<int> > data;
for(int i=0;i<N;i++){
cin>>value;
cin>>key;
data[key].push_back(value);
}

1
2
3
4
5
6
7
8
9
//遍历
//写法1
for(<int, vector<int> > ::iterator it=mp.begin(); it!= mp.end();it_++){
cout<<it->first<<it->second<<endl;
}
//写法2
for(auto &pnt : mp){
cout<<pr.first<<pr.second<<endl;
}

string

储存字符串的 string末尾没有''

1
2
3
string s1;           // 构造字符串,为空
string s2 = "awa!"; // 构造字符串,并赋值awa!
string s3(10, '6'); // 构造字符串,通过构造函数构造为6666666666
目的 函数
int / long long / float / double / long double string to_string()
string int stoi()
1
2
3
4
5
6
7
8
9
10
//常见操作
// 优化前: 15139ms
string s;
for (int i = 0; i < 5e5; i++)
s = s + "a";

// 优化后: < 1ms (计时器显示0)
string s;
for (int i = 0; i < 5e5; i++)
s += "a";

pair

> #include <utility>

在士兵训练问题中思考:为什么map不能替代pair数组?

因为map中一个key只能对应一个value,而pair没有这个要求,同时pair<int,int> arr[N],对其进行排序,先根据first排序再根据second排序

1
2
3
4
5
pair<int, char> pr = {1, 'a'};//单个pair的初始化
pair<int,char> arr[N];
for(int i=0;i<N;i++>){
cin>>arr[i].fisrt>>arr[i].second;
}

STL
http://lyklbw.github.io/2025/04/01/STL/
作者
lyklbw
发布于
2025年4月1日
许可协议