编译运行:clang++ -std=c++26 -Wall -Wextra -pthread 测试_第07章_容器.cpp -o t && ./t(需先 cd 测试/)
// 第7章测试:容器
#include <print>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <deque>
#include <array>
#include <algorithm>
#include <numeric>
#include <string>
#include <span>
int failures = 0;
#define CHECK(expr) \
do { \
if (!(expr)) { \
++failures; \
std::println("FAIL 第{}行: {}", __LINE__, #expr); \
} \
} while (0)
int main() {
// 7.1 vector 基础
std::vector<int> v;
v.push_back(10);
v.push_back(20);
CHECK(v[0] == 10 && v.at(1) == 20);
CHECK(v.size() == 2);
v.pop_back();
CHECK(v.size() == 1);
v.push_back(30);
v.push_back(40);
// 初始化方式
std::vector<int> a{1, 2, 3};
std::vector<int> c(5, 7);
CHECK(c.size() == 5 && c[4] == 7);
std::vector<int> d = a;
d[0] = 99;
CHECK(a[0] == 1); // 拷贝独立
// 7.2 遍历方式
int sum = 0;
for (int x : v) sum += x; // 10+30+40
CHECK(sum == 80);
for (int& x : v) x *= 2;
CHECK(v[1] == 60);
sum = 0;
for (std::size_t i = 0; i < v.size(); ++i) sum += v[i];
CHECK(sum == 160);
// 7.3 map
std::map<std::string, int> scores;
scores["张三"] = 90;
scores["李四"] = 85;
CHECK(scores["张三"] == 90);
CHECK(scores.contains("张三"));
CHECK(!scores.contains("王五"));
CHECK(scores["不存在"] == 0); // [] 会插入 0
scores.erase("不存在");
CHECK(scores.size() == 2);
// map 遍历(有序:李四 在 张三 前,按字典序)
std::string keys;
for (const auto& [name, score] : scores) keys += name;
CHECK(keys == "张三李四");
// 注:中文字符串排序按字节序,这里顺序是固定的(UTF-8 字节序)
// unordered_map
std::unordered_map<std::string, int> um;
um["x"] = 1;
CHECK(um["x"] == 1);
// 7.4 set
std::set<int> s{3, 1, 2, 2, 3};
CHECK(s.size() == 3); // 去重
CHECK(s.contains(2));
s.insert(4);
s.erase(1);
CHECK(s.size() == 3);
// 7.5 pair / tuple / 结构化绑定
std::pair<int, std::string> p{1, "一"};
CHECK(p.first == 1 && p.second == "一");
std::tuple<int, double, std::string> tup{1, 2.5, "x"};
CHECK(std::get<0>(tup) == 1);
CHECK(std::get<2>(tup) == "x");
auto [n, dbl, str] = tup;
CHECK(n == 1 && dbl == 2.5 && str == "x");
// 7.6 其他容器
std::deque<int> dq{1, 2, 3};
dq.push_front(0);
CHECK(dq[0] == 0 && dq.size() == 4);
std::array<int, 3> arr{1, 2, 3};
CHECK(arr.size() == 3);
int raw[3] = {1, 2, 3};
std::span<int> sp(raw);
CHECK(sp.size() == 3);
// 7.7 通用操作
std::vector<int> u{5, 3, 1, 4, 2};
std::sort(u.begin(), u.end());
CHECK(std::is_sorted(u.begin(), u.end()));
auto it = std::find(u.begin(), u.end(), 4);
CHECK(it != u.end() && *it == 4);
CHECK(std::find(u.begin(), u.end(), 99) == u.end());
// 7.8 迭代器
auto it2 = std::find(v.begin(), v.end(), 60);
CHECK(it2 != v.end());
// 迭代器失效演示:插入后旧迭代器不要再用
std::vector<int> w{1, 2, 3};
auto old = w.begin();
(void)old;
w.push_back(4); // 可能触发扩容
// 此时 old 已失效——再解引用是未定义行为,绝不能写
CHECK(w.size() == 4);
// 求和用算法
CHECK(std::accumulate(v.begin(), v.end(), 0) == 160);
if (failures == 0) std::println("全部通过");
return failures;
}