文章目录
- Day10 标准模板库学习笔记(2025.04.02)
- 一、函数和数组能否放入 STL 容器?
- 1. 引用不能直接作为容器元素类型
- ✅ 推荐做法:使用 `std::reference_wrapper<T>`
- 2. 函数不能直接作为容器元素类型
- ✅ 推荐做法一:使用函数指针类型
- ✅ 推荐做法二:使用 `std::function`
- 补充知识:函数和数组的“衰变”行为
- 二、数组能否放入容器?
- ❌ 直接存放原生数组类型 `T[N]` 不被支持
- ✅ 推荐做法一:使用数组指针
- ✅ 推荐做法二(更推荐):使用 `std::array`
- 三、测试代码
- 四、总结
- 实践建议
Day10 标准模板库学习笔记(2025.04.02)
一、函数和数组能否放入 STL 容器?
1. 引用不能直接作为容器元素类型
C++ 的容器如 std::vector
不支持存储引用类型(例如 int&
),因为引用并非对象本身,不能被复制或赋值。
std::vector<int&> rv; // ❌ 编译失败
✅ 推荐做法:使用 std::reference_wrapper<T>
标准库提供了 std::reference_wrapper
类模板,它可以将引用包装为对象,从而实现“间接”存储引用。
#include <functional>
std::vector<std::reference_wrapper<int>> rv1;
rv1.push_back(i); // i 是 int 类型变量
你也可以自定义类似的封装类,但通常没必要:
template <typename T>
class my_reference_wrapper {T& r;
public:my_reference_wrapper(T& i) : r(i) {}
};
2. 函数不能直接作为容器元素类型
函数名本身不是对象,而是函数类型,不能直接作为 std::vector
的元素类型。
std::vector<decltype(add)> fv; // ❌ 编译失败
✅ 推荐做法一:使用函数指针类型
函数名在赋值或传参时会自动“衰变”(decay)为函数指针。