OI学习笔记 - C++附加的STL容器

1. pair 的使用

1.1 特点与适用场景

  • 特点: pair 是 C++ 标准库中的一个模板类,用于存储两个不同类型的数据它提供了快速访问两个元素的接口
  • 适用场景: 当需要同时存储两个相关数据时,比如键值对、二维点坐标、或者需要按某个字段排序时

1.2 典型操作

  • 定义: pair<Type1, Type2> p;
  • 初始化: pair<int, int> p(1, 2);auto p = make_pair(1, 2);
  • 访问元素: p.firstp.second
  • 排序: pair 默认按 first 排序,first 相同时按 second 排序

1.3 使用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
vector<pair<int, string>> vec = {{3, "apple"}, {1, "banana"}, {2, "cherry"}};
sort(vec.begin(), vec.end());
for (auto &p : vec) {
cout << p.first << " " << p.second << endl;
}
return 0;
}

输出:

1
2
3
1 banana
2 cherry
3 apple

2. tuple 的使用

2.1 特点与适用场景

  • 特点: tuplepair 的扩展,可以存储多个不同类型的元素它提供了灵活的多字段存储能力
  • 适用场景: 当需要存储多个相关数据时,比如存储学生信息(姓名、年龄、成绩)

2.2 典型操作

  • 定义: tuple<Type1, Type2, ..., Typen> t;
  • 初始化: tuple<int, int, int> t(1, 2, 3);auto t = make_tuple(1, 2, 3);
  • 访问元素: get<0>(t)get<1>(t)

2.3 使用实例

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <vector>
#include <tuple>
using namespace std;

int main() {
vector<tuple<int, int, int>> vec = {{3, 1, 5}, {1, 2, 4}, {2, 3, 6}};
for (auto &t : vec) {
cout << get<0>(t) << " " << get<1>(t) << " " << get<2>(t) << endl;
}
return 0;
}

输出:

1
2
3
3 1 5
1 2 4
2 3 6

3. 总结

  • pair: 适合存储两个相关数据,常用于排序、映射等场景
  • tuple: 适合存储多个相关数据,提供了更大的灵活性
  • 在信息学竞赛中,pair 更常用,尤其是需要按某个字段排序时而 tuple 在需要存储多字段数据时非常方便,但使用频率相对较低掌握它们的基本操作和适用场景,可以显著提高代码的简洁性和效率