侯捷C++系列精品课学习笔记
时间: 2025-04-25 22:42:18 浏览: 38
### 关于侯捷 C++ 系列课程学习笔记
#### 内存管理和 `std::allocator`
在探讨内存管理时,`std::allocator` 是一个重要的概念。它提供了一种通用的方式来进行动态内存分配和释放操作[^1]。通过使用 `std::allocator`,可以更灵活地控制容器内部对象的创建与销毁。
```cpp
#include <memory>
using namespace std;
int main() {
allocator<int> alloc;
const int n = 1000;
int* p = alloc.allocate(n);
// 构造元素
uninitialized_fill_n(p, n, 0);
// 销毁并回收内存
destroy_n(p, n);
alloc.deallocate(p, n);
}
```
这段代码展示了如何利用 `std::allocator` 来手动管理一块整型数据的空间,并对其进行初始化以及最终清理工作。
#### 使用迭代器简化输入处理
对于从标准输入流读取数值并将这些值存储至目标容器的操作,可以通过组合 `istream_iterator` 和算法库中的 `copy()` 函数来实现简洁高效的解决方案[^2]:
```cpp
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
vector<double> c;
istream_iterator<double> eos; // 表示结束标记
istream_iterator<double> iit(cin); // 创建基于cin的输入迭代器
copy(iit, eos, back_inserter(c)); // 将所有输入复制到向量c中
}
```
此程序片段能够方便地接收来自用户的多个浮点数作为输入,并自动将其追加到指定的目标集合内而无需显式循环结构。
#### 移动语义的重要性及其应用
当涉及到像 `std::vector` 这样的序列式容器时,确保自定义类型的移动构造函数和赋值运算符被声明为 `noexcept` 至关重要。这不仅有助于提高性能,还可能影响某些 STL 容器的行为逻辑,比如扩容机制会优先考虑调用 noexcept 的版本以减少异常风险[^3]。
```cpp
class MyClass {
public:
MyClass(MyClass&& other) noexcept : member(std::move(other.member)) {}
MyClass& operator=(MyClass&& other) noexcept {
if (this != &other){
member = std::move(other.member);
}
return *this;
}
private:
string member;
};
```
上述类实现了无抛出保证的右值引用重载方法,从而使得该类型更适合用于频繁变动大小的数据结构之中。
#### 初始化列表 (`initializer_list`) 及其特性
最后,在介绍现代 C++ 特性的过程中不得不提到 `initializer_list`。这是一种特殊的模板参数形式,允许我们采用花括号语法传递一组同质化的初始值给构造函数或其他接受此类参数的地方[^4]。值得注意的是,尽管看起来像是拥有自己的副本,实际上 initializer_list 并不持有任何实际的对象实例——它仅仅是指向原始数组的一个视图而已。
```cpp
template<typename T>
void print(const initializer_list<T>& ilist){
for(auto elem : ilist)
cout << elem << " ";
}
// 调用方式如下所示:
print({1, 2, 3});
```
阅读全文
相关推荐















