加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:16:51 所属栏目:百科 来源:网络整理
导读:故事开始于我以为很简单的事情: 我需要设计一个使用一些STL容器的类.我需要给类的用户访问这些容器的不可变版本.我不希望用户能够更改容器(例如,它们不能在列表中push_back()),但是我希望用户能够更改包含的对象(使用back()获取元素并进行修改) : class Fo
故事开始于我以为很简单的事情:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读