应搜索具体函数、报错或场景,如std::vector插入慢因扩容拷贝、std::sort编译失败因缺少operator

别用“STL_C++标准库教程”当搜索关键词——它不指向任何真实问题,也找不到你要的答案。 真正该搜的是具体函数、报错信息或场景,比如 std::vector 插入慢、std::sort 编译不过、std::map 迭代器失效这些。
为什么 std::vector::push_back 有时慢得反常?
不是函数本身慢,是内存重分配触发了拷贝(或移动)所有已有元素。尤其存的是大对象、或没预留空间时,每次扩容都可能 O(n)。
- 提前调用
reserve():知道大概容量就先v.reserve(1000) - 确认元素类型是否支持移动语义:自定义类要写好移动构造函数,否则
push_back可能深拷贝 - 避免在循环里反复
push_back且不 reserve:比如读文件逐行塞字符串,先reserve再 push 效果明显
std::sort 编译失败:no match for ‘operator
这是最常见报错之一,说明你传给 std::sort 的容器里存的类型,没定义 operator,或者定义得不满足严格弱序要求。
Python v2.4版chm格式的中文手册,内容丰富全面,不但是一本手册,你完全可以把她作为一本Python的入门教程,教你如何使用Python解释器、流程控制、数据结构、模板、输入和输出、错误和异常、类和标准库详解等方面的知识技巧。同时后附的手册可以方便你的查询。
- 自定义结构体必须显式定义
operator,不能只靠成员变量可比 - lambda 作为第三个参数更安全:
std::sort(v.begin(), v.end(), [](const auto& a, const auto& b) { return a.id - 如果用
std::less或默认比较,确保类型支持,且重载不抛异常(否则行为未定义)
std::map 迭代器在 erase 后立刻失效
std::map::erase(iterator) 返回的是下一个有效迭代器(C++11 起),但很多人仍习惯写 it++ 后再 erase,结果二次递增非法迭代器。
立即学习“C++免费学习笔记(深入)”;
- 正确写法:
it = m.erase(it);—— 删除并自动跳到下一位置 - 想删满足条件的所有项,别用
for (auto it = m.begin(); it != m.end(); ++it),改用 while 循环 +erase返回值 - 注意:
erase(key)返回删除个数(0 或 1),不返回迭代器;只有erase(iterator)和erase(first, last)才返回迭代器
STL 容器和算法的边界很清晰,但组合使用时容易忽略细节:比如 std::unique 不真删元素、std::string 的 small string optimization 影响移动成本、std::function 拷贝开销比想象中大……这些都不是文档里一眼能看到的,得在调试时盯住实际行为。









