7.13 创建自己的容器

有了STL作基础,用户就可以创建自己的容器了。假定读者根据提供的迭代器进行模仿,用户自己创建的新容器将会表现得就好像一个内置的STL容器。

考虑某个“环形”数据结构,它是一个循环的序列容器。如果到达了环的末尾端点,即此时它刚好是绕回到起始端点(末尾端点和起始端点是同一个点)。这可以在熟练掌握list的基础上实现,如下所示:

7.13 创建自己的容器 - 图1

7.13 创建自己的容器 - 图2

读者可以看到,绝大多数编码都是针对迭代器进行的。这个Ring iterator必须知道如何循环回到起始端点,所以它必须持有一个指向作为其“双亲”Ring对象的list的引用,从而知道是否已经到了环的末尾端点,这样它才能知道如何回到起始端点。

必须注意,为Ring设置的接口相当有限;特别是,这里没有end()函数,因为一个环仅仅保持进行循环的状态。这就意味着不能在需要使用超越末尾的迭代器的任何STL算法中使用Ring, STL中这样的算法有很多。(添加这个特征并不是无足轻重的练习。)尽管这似乎使其使用受到了限制,但是考虑一下stack、queue和priority_queue,它们甚至全都没有产生任何迭代器!