CPP标准模板库 随笔

对于无序容器而言,其次序是不固定的,就算添加一个元素,也可能全盘改变次序。唯一可以保证的是,内容相同的元素会相邻。(eg: 23,1,1,25,3,27,5,7,11,11)

迭代器的种类:

  1,前向迭代器(Forward Iterator) 只能够以累加操作符向前迭代。 forward_list 的迭代器属于此类。其他容器如unordered_set , unordered_multiset, unordered_map 和 unordered_multimap也都至少是此类(但标准库其实为他们提供的是双向迭代器)

  2,双向迭代器(Bidirectional Iterator)以递增,递减进行前进或者后退。list set multiset map multimap

  3,  随机迭代器 (Random-access Iterator) 不但具备双向迭代器能力,还具备随机访问能力。具体的说,它们提供了迭代器算术运算的必要操作符(和寻常指针的算术运算完全对应)。你可以对迭代器增加或减少一个偏移量,计算两个迭代器之间的距离,

    或者使用 < 和 > 之类的relational操作符进行比较。vector , deque, array 和 string提供的迭代器都属于此类。

  4, 输入型迭代器 (Input Iterator) 向前迭代时能够读取/处理Value。 Input stream 迭代器就是这样一个例子。

  5, 输出型迭代器 (Output Iterator) 向前迭代时能够涂写value。Inserter 和 Output stream 迭代器属于此类。

注意,为了写出与具体类型无关的代码,最好不要使用随机访问迭代器的特有操作。例如:

//可以在任何容器使用
for
(auto pos = coll.begin(); pos != coll.end(); ++pos){ //... } //下面这个就不太适用了,list set map 不支持 operator <
for(auto pos = coll.begin(); pos != coll.end(); ++pos){ //... }


算法

算法并非容器类的成员函数,而且搭配迭代器使用的全局函数。优势是,一次实现,所有容器可操作。大大提高了程序库的能力和弹性,大幅降低了代码量。

注意,这不是OOP思维,而是泛型函数编程思维(generic functional programming paradigm)。缺陷,不似OOP中数据与操作紧密结合,代价是有失直观,其次某些数据结构和算法之间并不兼容。更甚,某些容器和算法虽然勉强兼容却毫无用处。因此,需要了解其缺陷,趋利避害。

迭代器之适配器

迭代器(Iterator)是个纯抽象的概念:任何东西,只要其行为类似迭代器,他就是一个迭代器。CPP标准库提供了数个预定义的特殊迭代器,亦即所谓的 迭代器适配器。它们不仅是辅助性质而已,它们赋予整个迭代器抽象概念更强大的威力。

猜你喜欢

转载自www.cnblogs.com/gardenofhu/p/9442156.html