C++ STL介绍 - Stanford CS107 Handout 03

基本信息

  • 云盘路径:/田浩然上传的资料/电子书/ProgrammingParadigms/materials/icsppcs107/03-Introducing-The-STL.pdf
  • 文件大小:104 KB
  • 页数:8页
  • 来源:Stanford CS107 Spring 2008
  • 作者:Course Staff

核心内容概述

这是斯坦福大学CS107编程范式课程的STL入门讲义,介绍了C++标准模板库中最常用的三个容器:pair、vector和map。

关键知识点

1. pair容器

最简单的STL容器,是一个包含两个字段的结构体:

template <class U, class V>
struct pair {
    U first;
    V second;
    pair(const U& first = U(), const V& second = V()) :
        first(first), second(second) {}
};
 
template <class U, class V>
pair<U, V> make_pair(const U& first, const V& second);
  • 使用struct而非class,first和second字段直接可访问
  • map等关联容器插入数据时需要pair
  • 示例:portfolio.insert(make_pair(string("LU"), 400));

2. vector容器

类型安全的顺序容器,行为类似数组:

#include <vector>
using namespace std;
 
template <class T>
class vector {
public:
    vector();
    vector(const vector<T>& originalMap);
    typedef implementation_specific_class_1 iterator;
    // ...
    bool empty() const;
    long size() const;
    void clear();
    void push_back(const T& elem);
    void pop_back();
    T& operator[](int i);
    iterator insert(iterator where, const T& elem);
    iterator erase(iterator where);
    iterator begin();
    iterator end();
};

关键特性:

  • 自动增长和收缩
  • 支持operator[]直接索引
  • push_back追加元素
  • erase返回新迭代器(避免悬空)
  • 注意:vector操作可能使已有迭代器失效

遍历方式:

// 索引方式
for (int i = 0; i < v.size(); i++) sum += v[i];
 
// 迭代器方式(推荐)
for (vector<double>::const_iterator curr = v.begin(); curr != v.end(); ++curr)
    sum += *curr;

erase注意事项:

  • erase会失效当前迭代器
  • erase返回下一个有效迭代器
  • 循环中需正确处理迭代器更新

3. map容器

通用的符号表,支持任意键值类型:

#include <map>
using namespace std;
 
template <class Key, class Value>
class map {
public:
    map();
    map(const map<Key, Value>& originalMap);
    pair<iterator, bool> insert(const pair<Key, Value>& newEntry);
    iterator find(const Key& key);
    const_iterator find(const Key& key) const;
    Value& operator[](const Key& key);
    iterator begin();
    iterator end();
};

insert方法:

  • 不允许多次赋值相同key
  • 返回pair<iterator, bool>,second指示是否插入成功

operator[]方法:

  • 返回Value的引用,可直接修改
  • 比insert更便捷:portfolio["LU"] = 400;

find方法:

  • 返回迭代器,需与end()比较
  • const_map使用const_iterator

4. 重要概念总结

概念说明
迭代器类似指针,遍历容器元素
const_iterator只读迭代器,可递增但不能修改
插入失效vector/deque插入可能使迭代器失效
erase返回返回下一个有效迭代器
end()哨兵每个容器有自己的end()值

5. 最佳实践

  1. 大对象传引用:避免拷贝构造开销
  2. 使用const_iterator:只读访问时使用
  3. 检查insert返回值:确认是否插入成功
  4. erase后使用返回值:避免迭代器失效问题
  5. 用operator[]简化:已知key存在时比insert方便

关联知识