【问题标题】:effective way to get std::map element with a deleting one in the container获取 std::map 元素并在容器中删除元素的有效方法
【发布时间】:2016-01-08 15:40:15
【问题描述】:

有一个类似的对象:

std::map<std::string, MyClass> data;

其中 MyClass 的复制成本很高。 在某些应用程序运行流程时刻,我需要执行一个按键检索 MyClass 对象的操作(通常的 operator[]),但我需要从容器中撕下这个对象。 直接解决方案是复制到局部变量,然后在容器中擦除。但是对于 MyClass 来说,复制是一项繁重的操作。 有没有办法(可能在 C++11 术语中)避免复制/删除?可能有些将语义从容器移动到局部变量?不知道该怎么做。

【问题讨论】:

  • 最简单的方法是将有效的移动语义添加到MyClass
  • 你能告诉我这个技巧吗?我不是指 MyClass 的可移动 ctor,而是在我的情况下使用它,以防可移动 MyClass 已经实现
  • 如果MyClass 已经是可移动的并且您有一个迭代器it 指向相关元素,那么您可以将映射值移出到局部变量然后销毁该元素:@987654325 @

标签: c++ stl stdmap


【解决方案1】:

我可以立即想到两种处理此问题的好方法。可能最简单的,就是将数据定义为

std::map<std::string, MyClass*> data;

这意味着它现在拥有指针。您必须自己实例化 MyClass 的元素,存储在您的地图中,然后从地图中删除,而不会影响底层对象本身。如果您愿意,智能指针可以简化对象管理。

另一种方法是为 MyClass 实现移动语义,并确保 MyClass 的移动运算符更加优化。如果对所有类成员执行移动操作仍然很昂贵,那么制作非常快速的移动操作符的一种相当有效的方法是让 MyClass 维护一个指向包含所有数据的结构的指针,并在类构造期间初始化指针并在析构函数中删除它。那时您的移动运算符实际上只是将指针从源移动到目标。不幸的是,这为您在 MyClass 中的所有其他操作增加了一定程度的间接性。

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 2019-06-30
    • 2011-06-03
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多