C++11 标准库笔记1

2020/12/19 10:09
阅读数 36

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

函数对象

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部