如何(深)从const对象拷贝地图

问题描述 投票:3回答:6

我还有一个问题,我似乎无法来解决......,或发现本网站上...

我有一个对象(称为数据对象)与地图,声明如下:

std::map<size_t, DataElement*> dataElements;

现在我有一个复制功能(在拷贝构造函数中使用):

void DataObject::copy(DataObject const &other) {

    //here some code to clean up the old data in this object...

    //copy all the elements:
    size = other.getSize();
    for(size_t i = 0; i < size; ++i) {
            DataElement* dat = new DataElement(*other.dataElements[i]);
            dataElements[i] = dat;
    }

}

这并不编译,因为dataElements [i]是不可能const对象上。如何使所有的地图是由一个const对象所拥有的元素的深层副本?

我知道,查找()函数是可能的一个const地图上,但后来我怎么去,我要复制实际的对象?

c++ stl map const deep-copy
6个回答
8
投票
std::map<size_t, DataElement*>::const_iterator it = other.dataElements.begin();
while(it != other.dataElements.end())
{
    dataElements[it->first] = new DataElement(*(it->second));
    ++it;
}

我几乎可以肯定这应该工作。


1
投票

你需要使用std ::变换。这确实副本,同时也对每个元素执行的功能。在你的情况下,值的深层副本。

因此,这将做一个变压器:

class DeepCopyMapPointer
{
   typedef std::map<size_t, DataElement*> map_type;
   typedef map_type::value_type value_type;

public:
   value_type operator()( const value_type & other ) const
   {
      return value_type(other.first, new DataElement(*other.second) );
   }
};

void DataObject::copy(DataObject const &other) 
{
   std::transform(other.dataElements.begin(), other.dataElements.end(),
      std::inserter( dataElements, dataElements.end() ), DeepCopyMapPointer() );
}

因为如果你不重复的元素,您的插入失败,结果你会得到一个泄漏这不是那么简单。你可以得到一轮通过编写自己的插件,而不是的std ::插入...有点棘手,但是这是你的下一个练习。


1
投票

由于您的地图只是有来自0整数键n - 1,只是改变你的容器类型的载体,以及当前的代码应该很好地工作(你需要调整目标容器,使可确保有足够的空间)。

如果您需要使用map出于某种原因(现有的API?),当你发现operator[]只有一个非const版本。

而是使用一个const_iterator办法(upvoted和@ PigBen的回答):

std::map<size_t, DataElement*>::const_iterator it = other.dataElements.begin();
while(it != other.dataElements.end())
{
    dataElements[it->first] = new DataElement(*(it->second));
    ++it;
}

0
投票

没有太多时间,现在来回答所以这将是短暂的。有一个拷贝构造函数映射,但它不会做一个深拷贝。你想用迭代器(map.begin(),map.end())。 * Iter项目会给你一个对的对象,所以你可以做(​​ ITER)。第一和/或(* ITER)。第二。 (或者类似的东西......这是一段时间...)

参考:http://www.sgi.com/tech/stl/Map.html


0
投票
for (auto& kv : other.dataElements) {
            dataElements[kv.first] = new DataElement(*kv.second);
        }

-1
投票

只是一个观察: - 你给到dataElements直接访问。 (other.data元件)。保持数据元素私下再提出类似的GetData元方法。

© www.soinside.com 2019 - 2024. All rights reserved.