CPP strings 与标准模板库

Leetcode 838 push dominos 解体思路

STL标准模板库

提供了一组表示容器、迭代器、函数对象和算法的模板。 Alex Stepanov & Meng Lee 一起开发了STL, 1994年第一版发布。STL不是面向对象的编程,而是一种不同的编程模式---泛型编程(generic programming)。 前者关注的是编程的数据方面,后者关注的是算法。共同特点是抽象与创建可重用代码,但理念决然不同。

容器

所有的STL容器都提供了一些基本方法,包括size(), swap, begin, end:后面两个返回指向容器的第一个与尾部的迭代器(一种广义指针)。 每一个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为iterator的typedef. 比如:
vector::iterator pd = scores.begin();
C++ 11的自动推断也可以用在这里:
auto pd = scores.begin();

几个有意思的操作

for_each() / random_shuffle() / sort() .
random_shuffle(books.begin(), books.end()) 随机排列区间中的元素。

泛型编程

泛型编程旨在编写独立与数据类型的代码, CPP中完成通用程序的工具是模板。模板使得算法独立于存储的数据类型,而迭代器使得算法独立于使用的容器类型。理解迭代器是理解STL的关键所在。
作为一种编程风格,最好避免直接使用迭代器,而尽可能使用STL函数(e.g., for_each)来处理细节。

迭代器类型

不同的算法对迭代器的要求不同,STL定义了五种迭代器输入迭代器、输出迭代器、正向迭代器、双向迭代器、随机访问迭代器

Priority Queue (优先级队列)

首先,其模板类型为 template < class T, class Container = vector<T>, class Compare = less < typename Container::value_type> > class priority_queue;。PQ是一类容器适配器,内部的元素按规定的“大小”(compare)排序。支持方法:

方法复杂度
size() O(1)
top() O(1)
empty() O(1)
push() O(log n)
embrace() O(log(last - first))

(logarithmic in the distance between first and last: Compares elements and potentially swaps (or moves) them until rearranged as a longer heap.)

函数embrace()优于push的地方在于,它不需要创建临时的object,然后将其放到容器里,然后再销毁这个object.

 

posted @ 2018-07-20 15:38  Fayder  阅读(222)  评论(0编辑  收藏  举报