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. 最佳实践
- 大对象传引用:避免拷贝构造开销
- 使用const_iterator:只读访问时使用
- 检查insert返回值:确认是否插入成功
- erase后使用返回值:避免迭代器失效问题
- 用operator[]简化:已知key存在时比insert方便