STL温故知新

STL核心架构

STL六大组件

  1. 容器(Containers) :管理数据集合的模板类
  2. 算法(Algorithms) :操作数据的函数模板
  3. 迭代器(Iterators) :容器与算法之间的桥梁
  4. 仿函数(Functors) :行为类似函数的对象
  5. 适配器(Adapters) :修改组件接口的包装器
  6. 分配器(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 不是线程安全的,需在多线程场景下显式同步。

相关推荐
_Twink1e10 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
dong_junshuai11 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
雪的季节11 小时前
Multisim14.0的详细中文安装步骤【附安装包】
c++
Persistent的粽子!12 小时前
C++:类与对象(二)
开发语言·c++
蒸蒸yyyyzwd13 小时前
cpp 选手备战秋招学习笔记 day23
c++·求职招聘
.YM.Z13 小时前
C++ STL 容器深度剖析:vector 与 list 的模拟实现及对比
开发语言·c++·vector·list
mengzhi啊15 小时前
QEventLoop loop配合loop.exec();替代while(1)。电脑cpu占用为0,使用while(1)cpu占用率100%
c++·qt
HugoStudio_SWAN15 小时前
洛谷 P1319 / P1320 压缩技术——同一枚硬币的正反面
c++·学习·程序人生·算法
小小晓.15 小时前
C++单例模式万字详解:6种实现演进+线程安全彻底解决+CRTP终极模板
c++·单例模式
j7~16 小时前
【C++11】C++11 新特性全套详解(列表初始化、右值引用、lambda 表达式、function 与 bind 包装器等)
c++·右值引用·lambda表达式·可变参数模板·移动语义·包装器·c++11发展史