我还有一个问题,我似乎无法来解决......,或发现本网站上...
我有一个对象(称为数据对象)与地图,声明如下:
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地图上,但后来我怎么去,我要复制实际的对象?
std::map<size_t, DataElement*>::const_iterator it = other.dataElements.begin();
while(it != other.dataElements.end())
{
dataElements[it->first] = new DataElement(*(it->second));
++it;
}
我几乎可以肯定这应该工作。
你需要使用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 ::插入...有点棘手,但是这是你的下一个练习。
由于您的地图只是有来自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;
}
没有太多时间,现在来回答所以这将是短暂的。有一个拷贝构造函数映射,但它不会做一个深拷贝。你想用迭代器(map.begin(),map.end())。 * Iter项目会给你一个对的对象,所以你可以做( ITER)。第一和/或(* ITER)。第二。 (或者类似的东西......这是一段时间...)
for (auto& kv : other.dataElements) {
dataElements[kv.first] = new DataElement(*kv.second);
}
只是一个观察: - 你给到dataElements直接访问。 (other.data元件)。保持数据元素私下再提出类似的GetData元方法。