C++ 标准库中的 `<list>` 头文件提供了 `std::list` 容器，它是一个基于双向链表实现的数据结构。以下是详细总结：

---

### **基本特性**
- **双向链表**：每个元素（节点）包含指向前后元素的指针，支持双向遍历。
- **高效插入/删除**：在任意位置插入或删除元素的时间复杂度为 *O(1)*。
- **无随机访问**：不能通过下标（如 `operator[]`）直接访问元素，需通过迭代器遍历。
- **内存分布**：元素分散存储，无内存连续性的要求，无容量（capacity）概念。

---

### **模板参数**
```cpp
template <class T, class Allocator = std::allocator<T>>
class list;
```
- **T**：元素类型。
- **Allocator**（可选）：内存分配器，默认为 `std::allocator<T>`。

---

### **主要成员函数**

#### 1. **构造函数**
- `list()`：默认构造空列表。
- `list(size_type count, const T& value)`：构造包含 `count` 个 `value` 的列表。
- `list(InputIt first, InputIt last)`：通过迭代器范围构造。
- `list(const list& other)`：拷贝构造函数。

#### 2. **元素访问**
- `front()`：返回第一个元素的引用。
- `back()`：返回最后一个元素的引用。
- **不支持** `operator[]` 或 `at()`。

#### 3. **迭代器**
- `begin()`, `end()`：正向迭代器。
- `cbegin()`, `cend()`：常量正向迭代器。
- `rbegin()`, `rend()`：反向迭代器。
- `crbegin()`, `crend()`：常量反向迭代器。

#### 4. **容量**
- `empty()`：检查是否为空。
- `size()`：返回元素数量。
- `max_size()`：返回可容纳的最大元素数。

#### 5. **修改操作**
- **插入**：
  - `push_front(const T& value)`, `emplace_front(Args&&... args)`
  - `push_back(const T& value)`, `emplace_back(Args&&... args)`
  - `insert(iterator pos, const T& value)`：在 `pos` 前插入元素，返回新元素迭代器。
- **删除**：
  - `pop_front()`, `pop_back()`
  - `erase(iterator pos)`：删除 `pos` 处元素，返回下一个元素的迭代器。
  - `erase(iterator first, iterator last)`：删除范围元素。
  - `clear()`：清空所有元素。
- **调整大小**：
  - `resize(size_type count)`：调整列表大小，默认填充 `T()`。

#### 6. **链表特有操作**
- `splice(iterator pos, list& other)`：将 `other` 的所有元素移动到 `pos` 前。
- `remove(const T& value)`：删除所有等于 `value` 的元素。
- `remove_if(Predicate pred)`：删除满足谓词条件的所有元素。
- `unique()`：删除连续重复元素（通常先排序再使用）。
- `merge(list& other)`：合并两个有序列表，`other` 变为空。
- `sort()`：排序（默认 `<` 运算符或自定义比较函数）。
- `reverse()`：反转链表顺序。

---

### **时间复杂度**
- **插入/删除**：任意位置 *O(1)*。
- **查找**：*O(n)*。
- **排序**：成员函数 `sort()` 的时间复杂度为 *O(n log n)*。

---

### **示例代码**
```cpp
#include <list>
#include <iostream>

int main() {
    std::list<int> nums = {5, 3, 1};
    nums.push_back(4);      // {5, 3, 1, 4}
    nums.push_front(2);     // {2, 5, 3, 1, 4}
    nums.remove(5);         // {2, 3, 1, 4}
    nums.sort();            // {1, 2, 3, 4}
    nums.unique();          // 无连续重复，无变化

    std::list<int> other = {6, 7};
    nums.splice(nums.end(), other); // nums: {1,2,3,4,6,7}, other 空

    nums.reverse();         // {7,6,4,3,2,1}
    for (int n : nums) {
        std::cout << n << " ";  // 输出: 7 6 4 3 2 1
    }
}
```

---

### **与其他容器对比**
| 特性               | `std::list`          | `std::vector`        | `std::deque`         |
|--------------------|----------------------|----------------------|----------------------|
| **内部结构**        | 双向链表             | 动态数组             | 分块数组             |
| **随机访问**        | 不支持（*O(n)*）     | 支持（*O(1)*）       | 支持（*O(1)*）       |
| **中间插入/删除**   | *O(1)*               | *O(n)*               | *O(n)*               |
| **内存连续性**      | 不连续               | 连续                 | 部分连续             |

---

### **适用场景**
- 需要频繁在任意位置插入/删除元素。
- 不需要随机访问，只需顺序或双向遍历。
- 元素较大时，避免 `vector`/`deque` 频繁内存重分配。

---

### **注意事项**
- 由于每个节点存储前后指针，内存开销较大（每个元素额外占用 2 指针空间）。
- 缓存不友好，遍历速度可能慢于 `vector`。
- C++11 引入的 `std::forward_list` 为单向链表，更节省空间，但仅支持前向遍历。

通过合理利用 `std::list` 的特性，可以在特定场景下显著优化程序性能。