具有可变内容的不可变容器

neu*_*uro 10 c++

故事从我认为非常简单的事情开始:

我需要设计一个将使用一些STL容器的类.我需要让类的用户访问这些容器的不可变版本.我不希望用户能够更改容器(push_back()例如,他们不能在列表中),但我希望用户能够更改包含的对象(获取元素back()并对其进行修改):

class Foo
{
    public:

    // [...]

    ImmutableListWithMutableElementsType getImmutableListWithMutableElements();

    // [...]
};

// [...]

myList = foo.getImmutableListWithMutableElements();
myElement = myList.back();
myElement.change(42); // OK

// [...]

// myList.push_back(myOtherElement); // Not possible
Run Code Online (Sandbox Code Playgroud)

乍一看,似乎const容器会这样做.但是,当然,您只能在const容器上使用const迭代器,并且无法更改内容.

乍一看,人们会想到像专用容器或迭代器这样的东西.我可能最终会这样做.

然后,我的想法是"有人必须已经做到了!" 或"必须存在优雅,通用的解决方案!" 我在这里问我关于SO的第一个问题:

如何将标准容器设计/转换为具有可变内容的不可变容器?

我正在努力,但我觉得有人会说"嘿,我每次都这样做,很容易,看!",所以我问......

感谢您提供任何提示,建议或精彩的通用方法:)


编辑:

经过一些实验,我最终得到了标准容器,可以处理一些特别装饰的智能指针.它接近尼古拉的回答.

可变元素的不可变容器的概念不是一个杀戮概念,请参阅Oli回答中的有趣注释.

特定迭代器的想法当然是正确的,但它似乎不实用,因为我需要适应任何类型的容器.

感谢大家的帮助.

Oli*_*rth 5

您可以只为开头和结尾提供非const迭代器,而不是向用户提供整个容器吗?这是STL的方式.


Nik*_*sov 5

最简单的选项可能是指针的标准STL容器,因为const-ness不会传播到实际对象.这样做的一个问题是STL不会清理您分配的任何堆内存.为此,请查看Boost指针容器库智能指针.