不可变的C++容器类

Geo*_*ton 9 c++ stl

假设我有一个C++类Container,它包含一些类型的元素Element.由于各种原因,在构造之后修改或替换内容是低效的,不合需要的,不必要的,不切实际的和/或不可能的(1).类似于const std::list<const Element>(2)的东西.

Container可以满足STL的"容器"和"序列"概念的许多要求.它可以提供多种类型,如value_type,reference等.它可以提供一个默认的构造函数,一个拷贝构造函数,一个const_iterator类型,begin() const,end() const,size,empty,所有的比较操作符,也许有些的rbegin() const,rend() const,front(),back(),operator[](),和at().

但是,Container不能提供insert,erase,clear,push_front,push_back,非const front,非const back,非const operator[]或者非const at与预期的语义.所以它似乎Container不能成为"序列".此外,Container不能提供operator=,并且swap,它不能提供iterator指向非const元素的类型.因此,它甚至不能成为"容器".

是否有一些不太能够Container满足的STL概念?是否有"只读容器"或"不可变容器"?

如果Container不符合任何规定的一致性水平,部分一致性是否有价值?当它没有资格时,是否会误导它看起来像一个"容器"?是否有一种简洁,明确的方式可以记录一致性,这样我就不必明确记录符合要求的语义?同样,一种记录它的方法,以便未来的用户知道他们可以利用只读的通用代码,但不要指望变异算法有效吗?

如果我放松这个问题,我会得到什么,因此Container是可分配的(但它的元素不是)?此时,operator=并且swap可能,但解除引用iterator仍然返回a const Element.请问Container现在有资格作为一个"容器"?

const std::list<T>具有大致相同的界面Container.这是否意味着它既不是"容器"也不是"序列"?

脚注(1)我的用例涵盖了整个范围.我有一个容器类可以调整一些只读数据,所以它必须是不可变的.我有一个容器,可以根据需要生成自己的内容,所以它是可变的,但你不能像STL所要求的那样替换元素.我还有另一个容器,它以一种insert()非常慢的方式存储它的元素,它永远不会有用.最后,我有一个字符串,以UTF-8存储文本,同时公开面向代码点的接口; 可变的实现是可能的,但完全没有必要.

脚注(2)这只是为了说明.我很确定std::list需要一个可分配的元素类型.

seh*_*ehe 1

只要你的对象可以提供一个符合条件的 const_iterator ,它就不需要有任何其他东西。在容器类上实现这一点应该很容易。

(如果适用,请查看 Boost.Iterators 库;它具有 iterator_facade 和 iterator_adaptor 类来帮助您了解具体细节)