目录
[1. 序列容器](#1. 序列容器)
[2. 关联容器](#2. 关联容器)
[3. 迭代器](#3. 迭代器)
[4. 常用算法](#4. 常用算法)
[5. 案例:学生成绩管理](#5. 案例:学生成绩管理)
在 C++ 中,STL(Standard Template Library,标准模板库)提供了丰富的容器、算法和迭代器,用于高效管理和操作数据。本章将介绍序列容器、关联容器、迭代器以及常用算法,并通过一个案例展示如何使用它们管理学生成绩。
1. 序列容器
序列容器(Sequence Containers)是按线性顺序存储元素的容器,常见的有:
-
vector:动态数组,支持快速随机访问,末尾插入删除高效。
-
deque:双端队列,支持两端快速插入和删除。
-
list:双向链表,支持任意位置快速插入和删除,但不支持随机访问。
示例代码:
cpp
#include <iostream>
#include <vector>
#include <deque>
#include <list>
int main() {
// vector
std::vector<int> vec = {1, 2, 3};
vec.push_back(4); // 在末尾插入
std::cout << "Vector: ";
for (int v : vec) std::cout << v << " ";
std::cout << std::endl;
// deque
std::deque<int> deq = {10, 20};
deq.push_front(5); // 在前面插入
deq.push_back(25); // 在后面插入
std::cout << "Deque: ";
for (int d : deq) std::cout << d << " ";
std::cout << std::endl;
// list
std::list<int> lst = {100, 200, 300};
lst.push_back(400);
lst.push_front(50);
std::cout << "List: ";
for (int l : lst) std::cout << l << " ";
std::cout << std::endl;
return 0;
}
2. 关联容器
关联容器(Associative Containers)按照特定顺序存储元素,提供快速查找功能。常见有:
-
map:键值对容器,键唯一,有序。
-
set:集合,元素唯一,有序。
-
unordered_map:键值对容器,键唯一,无序,查找效率高。
-
unordered_set:集合,元素唯一,无序。
示例代码:
cpp
#include <iostream>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
int main() {
// map
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 88;
std::cout << "Map: ";
for (auto &[name, score] : scores)
std::cout << name << ":" << score << " ";
std::cout << std::endl;
// set
std::set<int> s = {5, 3, 7, 5}; // 自动去重
std::cout << "Set: ";
for (int x : s) std::cout << x << " ";
std::cout << std::endl;
// unordered_map
std::unordered_map<std::string, int> umap;
umap["Charlie"] = 70;
umap["David"] = 85;
// unordered_set
std::unordered_set<int> uset = {10, 20, 10, 30};
return 0;
}
3. 迭代器
迭代器(Iterator)是 STL 的通用指针概念,用于遍历容器。
常用方法:
-
begin():指向容器首元素 -
end():指向容器尾后位置(不包含元素)
示例代码:
cpp
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::cout << "Vector elements: ";
for (auto it = vec.begin(); it != vec.end(); ++it)
std::cout << *it << " "; // 使用迭代器访问元素
std::cout << std::endl;
}
4. 常用算法
STL 提供丰富的算法,常用的有:
-
sort(begin, end):排序 -
find(begin, end, value):查找元素 -
count(begin, end, value):统计元素出现次数
示例代码:
cpp
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> vec = {4, 1, 3, 2, 3};
// 排序
std::sort(vec.begin(), vec.end());
std::cout << "Sorted vector: ";
for (int v : vec) std::cout << v << " ";
std::cout << std::endl;
// 查找
auto it = std::find(vec.begin(), vec.end(), 3);
if (it != vec.end())
std::cout << "Found 3 at position: " << (it - vec.begin()) << std::endl;
// 统计
int cnt = std::count(vec.begin(), vec.end(), 3);
std::cout << "Number of 3s: " << cnt << std::endl;
return 0;
}
5. 案例:学生成绩管理
目标 :用 map 存储学生姓名和成绩,并进行成绩排序和查找。
cpp
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
int main() {
std::map<std::string, int> students = {
{"Alice", 95},
{"Bob", 88},
{"Charlie", 70},
{"David", 85}
};
// 将 map 转换为 vector 方便排序
std::vector<std::pair<std::string, int>> vec(students.begin(), students.end());
// 按成绩降序排序
std::sort(vec.begin(), vec.end(), [](auto &a, auto &b) { return a.second > b.second; });
std::cout << "Students sorted by score:" << std::endl;
for (auto &[name, score] : vec)
std::cout << name << ": " << score << std::endl;
// 查找成绩大于 80 的学生
std::cout << "Students with score > 80:" << std::endl;
for (auto &[name, score] : vec)
if (score > 80) std::cout << name << ": " << score << std::endl;
return 0;
}
运行效果:
cpp
Students sorted by score:
Alice: 95
Bob: 88
David: 85
Charlie: 70
Students with score > 80:
Alice: 95
Bob: 88
David: 85
总结
-
序列容器适合按顺序存储数据。
-
关联容器适合快速查找和去重。
-
迭代器是访问容器的通用方式。
-
STL 算法极大简化排序、查找和统计操作。
-
将容器与算法结合,可高效实现复杂的数据管理任务,例如学生成绩管理。