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

c – 具有可变内容的不可变容器,第1张

概述故事开始于我以为很简单的事情: 我需要设计一个使用一些STL容器的类.我需要给类的用户访问这些容器的不可变版本.我不希望用户能够更改容器(例如,它们不能在列表中push_back()),但是我希望用户能够更改包含的对象(使用back()获取元素并进行修改) : class Foo{ public: // [...] ImmutableListWithMutableEl 故事开始于我以为很简单的事情:

我需要设计一个使用一些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

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

乍看之下,像专门的容器或迭代器这样的东西可以想到.我可能会结束这一点.

那么,我的想法是“有人一定已经做到了!”或者“一个优雅,通用的解决方案必须存在!”我在这里问我的第一个问题:

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

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

感谢您提供任何提示,建议或精彩的通用方式来做到这一点:)

编辑:

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

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

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

感谢大家的帮助.

解决方法 最简单的选项可能是指针的标准STL容器,因为常量不传播到实际对象.一个问题是,STL不会清理您分配的任何堆内存.看看 Boost Pointer Container Library或 smart pointers. 总结

以上是内存溢出为你收集整理的c – 具有可变内容的不可变容器全部内容,希望文章能够帮你解决c – 具有可变内容的不可变容器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1254372.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存