STL(standard template library,标准模板库)
初始化:int values[] {1, 2, 3}
引入 range-based for 循环:
for (decl: coll) {
statement
}
// 打印某集合内所有元素,这里不用 & 会产生 copy
template <typename T>
void printElements (const T& coll) {
for (const auto& elem : coll) {
std::cout << elem << std::endl;
}
}
拿 lambda 当作 inline 函数使用
[] () -> double {
return 42;
}
4、命名空间(Namespace)std
当你采用不同的模块或程序库时,经常会出翔名称冲突现象,这是因为不同的模块和程序库可能对不同的对象使用相同的标识符。Namespace 正是用来解决这个问题的。所谓 namespace 是指标识符的某种可见范围。和 class 不同, namespace 具有可扩展开放性,可发生于任何源码文件上。因此你可以使用一个 namespace 来定义若干组件,而它们可散布于多个实质模块内。这类组件的典型例子就是 C++ 标准库,因为 C++ 标准库使用了一个 namespace.
5、通用工具
Pair:将两个元素视为一个key/value,pair<T1, T2> p
void f(std::pair<int, cont char*>);
std::pair<int, const char*> p(42, "hello"); // make_pair
f(p);
Tuple:任意多个元素
tuple<string, int, int, complex<double>> t; // make_tuple
Smart Pointer:智能指针
多个 pointer 指向同一个对象,当其中一个 pointer 销毁时不该出现空悬指针;只有最后一个拥有者被删除时才销毁。
Class shared_ptr:共享拥有 shared_ptr<string> pNico(new string("nico")); // make_shared
Class unique_ptr:独占,继承 class auto_ptr
std::auto_ptr<int> p(new int);
*p = 42;
数值的极值(Numeric Limit):取代 C 语音的预处理常量
Type Trait 和 Type Utility:处理 type 属性
辅助函数:max,min
Class ratio<> 的编译期分数运算:
Clock 和 Timer:用来处理日期和时间的程序库。
头文件<cstddef>、<cstrdlib>和<cstring>:
6、STL 标准库
STL 内的所有组件都由 template(模板)构成。
STL 组件:基本观念就是将数据和操作分离。数据由容器类加以管理,操作则由可定制的算法定义之。迭代器在两者之间充当粘合剂,使任何算法都可以和任意容器交互运作。
>容器:用来管理某类对象的集合
>迭代器:用来在一个对象集合内遍历元素。
>算法:用来处理集合内的元素。
6.2 容器
总的来说可以分三大类:
1、序列式容器(Sequence container),有序的集合,有 5 个
array, 必须在初始化时指定大小。
vector, <vector>使用动态数组,在尾部增删都快速,当中间插入慢
deque(双端插入)使用动态数组,首尾快,中间慢
list(列表,双向链表实现,不提供随机访问) ,增删快,但访问慢
遍历访问 for (auto& elem : mylist) { }
forward_list,单向链表实现
2、关联式容器(Associative container),已排序的集合,大都有二叉树实现,每个节点有一个父和两个子,
优点是能快速查找出某个元素的值。有 4 个
set, 元素按 value 自动排序,不重复
multiset, 元素按 value 自动排序,可重复
map,每个元素都是 key/value pair,其中 key 是排序项,不重复
multimap,每个元素都是 key/value pair,其中 key 是排序项,可重复
3、无序容器(Unordered container),无序集合,常由 hash table 实现出来。
有 4 个 unordered_set, unordered_multiset, unordered_map 和 unorderd_multimap
4、其它容器,String
5、容器适配器,在上面基本容器基础上实现的,如 Stack, Queue, Priority queue
6.3 迭代器(Iterator)
迭代器是一个“可遍历 STL 容器全部或部分元素”的对象。迭代器用来表现容器中的某个位置。基本操作如下:
> Operator * ,返回当前位置上的元素值。
> Operator ++,下一个位置
> Operator ==,判断两个迭代器是否指向同一位置
> Operator =,对迭代器赋值
这与 pointer 一样的功能,不同的是迭代器是 smart pointer,具有遍历复杂数据结构的能力,其内部运作机制取决于其所遍历的数据结构。因此,每一种容器都必须提供自己的迭代器,而且接口基本相同。
如 begin() 和 end() 返回迭代器。
for (auto pos = coll.begin(); pos != coll.end(); ++pos) {} ++pos 比 pos++ 更高效,后者需要一个临时对象
6.4 算法
算法并非容器类的成员函数,而是一种搭配迭代器使用的全局函数。<algorithm>
所有算法都是用来处理一个或多个区间内的元素,需要保证区间是有效的,从起点能到达终点。是半开区间,不包含尾部元素的 [begin, end)
6.5 迭代器之适配器
迭代器是一个纯抽象概念。可以撰写一些类具备迭代器接口。
Insert iterator
函数对象