STL容器和迭代器

标准模板库核心组件

STL概述

STL(Standard Template Library)是C++标准库的重要组成部分,提供了通用的数据结构和算法。

STL的三大组件

  • 容器(Containers):存储和管理数据的数据结构
  • 迭代器(Iterators):访问容器元素的接口
  • 算法(Algorithms):操作数据的通用函数

序列容器

存储元素线性序列的容器

容器 特点 访问 插入/删除 适用场景
vector 动态数组 O(1) O(n) 随机访问频繁
deque 双端队列 O(1) O(1) 两端操作频繁
list 双向链表 O(n) O(1) 中间插入删除频繁

vector 使用示例


#include <vector>
using namespace std;

int main() {
    // 创建vector
    vector v;
    vector v2(10);          // 大小为10,初始值为0
    vector v3(10, 5);      // 大小为10,初始值为5
    vector v4 = {1, 2, 3, 4, 5};

    // 添加元素
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);

    // 访问元素
    cout << v[0] << endl;      // 10
    cout << v.at(1) << endl;   // 20(带边界检查)
    cout << v.front() << endl; // 第一个元素
    cout << v.back() << endl;  // 最后一个元素

    // 大小操作
    cout << v.size() << endl;   // 3
    cout << v.empty() << endl;  // false
    v.resize(5);                // 调整大小

    // 删除元素
    v.pop_back();              // 删除最后一个
    v.erase(v.begin() + 1);    // 删除第二个元素
    v.clear();                 // 清空所有元素

    // 遍历
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }

    // 使用迭代器
    for (vector::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }

    // C++11 范围for循环
    for (int x : v) {
        cout << x << " ";
    }

    return 0;
}
                

deque 使用示例


#include <deque>
using namespace std;

int main() {
    deque dq;

    // 两端操作
    dq.push_back(1);   // 后端插入
    dq.push_front(2);  // 前端插入
    dq.push_back(3);
    dq.push_front(4);

    // dq: 4 2 1 3

    cout << dq.front() << endl;  // 4
    cout << dq.back() << endl;   // 3

    // 两端删除
    dq.pop_front();  // 删除前端
    dq.pop_back();   // 删除后端

    // dq: 2 1

    return 0;
}
                

list 使用示例


#include <list>
using namespace std;

int main() {
    list lst = {1, 2, 3, 4, 5};

    // 任意位置插入
    auto it = lst.begin();
    advance(it, 2);  // 移动到第三个位置
    lst.insert(it, 99);  // 在位置2插入99

    // 任意位置删除
    it = lst.begin();
    advance(it, 3);
    lst.erase(it);

    // 拼接列表
    list lst2 = {6, 7, 8};
    lst.splice(lst.end(), lst2);  // 将lst2拼接到lst末尾

    return 0;
}
                

迭代器

迭代器是访问容器元素的通用接口,类似指针。

迭代器类型 支持的操作
输入迭代器++、*、==、!=
输出迭代器++、*
前向迭代器输入迭代器 + 多次遍历
双向迭代器前向迭代器 + --
随机访问迭代器双向迭代器 + []、+、-

迭代器操作


vector v = {1, 2, 3, 4, 5};

// begin() 和 end()
vector::iterator it = v.begin();  // 指向第一个元素
vector::iterator end = v.end();    // 指向最后一个元素之后

// 解引用
cout << *it << endl;  // 1

// 前进
it++;
cout << *it << endl;  // 2

// 后退
it--;
cout << *it << endl;  // 1

// 随机访问
cout << *(it + 2) << endl;  // 3

// 距离
int distance = end - it;  // 5

// rbegin() 和 rend() (反向迭代器)
vector::reverse_iterator rit = v.rbegin();
cout << *rit << endl;  // 5
                

迭代器可视化

1
2
3
4
5

容器适配器

基于序列容器的简化接口

适配器 底层容器 特点
stackdequeLIFO(后进先出)
queuedequeFIFO(先进先出)
priority_queuevector优先级队列

#include <stack>
#include <queue>

int main() {
    // 栈 (Stack)
    stack s;
    s.push(1);
    s.push(2);
    cout << s.top() << endl;  // 2
    s.pop();

    // 队列 (Queue)
    queue q;
    q.push(1);
    q.push(2);
    cout << q.front() << endl;  // 1
    cout << q.back() << endl;   // 2
    q.pop();

    // 优先队列 (Priority Queue)
    priority_queue pq;  // 大顶堆
    pq.push(3);
    pq.push(1);
    pq.push(4);
    cout << pq.top() << endl;  // 4

    // 小顶堆
    priority_queue, greater> min_pq;
    min_pq.push(3);
    min_pq.push(1);
    cout << min_pq.top() << endl;  // 1

    return 0;
}
                

选择合适的容器

容器选择指南

  • 需要随机访问:使用 vector
  • 两端频繁操作:使用 deque
  • 中间频繁插入删除:使用 list
  • LIFO:使用 stack
  • FIFO:使用 queue
  • 自动排序:使用 set 或 priority_queue
  • 键值对:使用 map