STL核心架构
STL六大组件
- 容器(Containers) :管理数据集合的模板类
- 算法(Algorithms) :操作数据的函数模板
- 迭代器(Iterators) :容器与算法之间的桥梁
- 仿函数(Functors) :行为类似函数的对象
- 适配器(Adapters) :修改组件接口的包装器
- 分配器(Allocators) :内存管理的模板类
STL设计哲学
- 泛型编程思想
- 效率优先
- 正交性设计(组件独立且可组合)
- 可扩展性
STL温故知新
1、string_view:
是 C++17 中引入的一个非常有用的工具,主要用于高效地处理字符串数据,尤其在不需要复制字符串内容时。
避免不必要的内存分配与复制
c
void print_string_view(std::string_view sv) {
std::cout << sv << std::endl;
}
传递 std::string_view
比传递 std::string
更高效,因为它不涉及字符串内容的复制。
支持常量与非常量字符串
std::string_view
可以指向常量字符串(const char*
)和非常量字符串(std::string
)。不过,std::string_view
本身是不可修改的,因此它不能直接修改视图所指向的字符串内容。
ini
const char* cstr = "Hello";
std::string_view view(cstr);
// view[0] = 'h'; // 错误:不能修改 const char*
注意事项
生命周期管理 :std::string_view
并不拥有其指向的数据,不要让 std::string_view
指向一个局部变量或已经释放的内存。
c
std::string_view view;
{
std::string str = "Temporary string";
view = std::string_view(str); // 这里会有悬挂引用的问题
}
// str 的生命周期结束,view 成为悬挂引用
2、使用vector需要注意哪些问题?
迭代器失效:vector 在扩容或删除元素时,会导致迭代器、指针和引用失效。
频繁扩容的性能开销:每次扩容都会重新分配内存并拷贝元素,可以提前使用 reserve 优化。
插入和删除性能:vector 在中间或头部插入和删除元素的性能较差,因为需要移动后续元素。
空间未释放:使用 clear 只清空元素,容量不变,可使用 shrink_to_fit 回收内存。
线程安全:vector 不是线程安全的,需在多线程场景下显式同步。