使用c ++将哈希表复制到另一个哈希表

时间:2010-03-26 04:23:22

标签: c++ hashtable

我从c ++开始,需要知道,在C ++中将一个哈希表复制到另一个哈希表的方法应该是什么?

我们可以使用:HashMap copyOfOriginal=new HashMap(original);

在java中轻松完成此操作

但是C ++怎么样?我应该怎么做呢?

更新

好吧,我是在一个非常基础的层面上做的,也许java示例是错误的。这就是我试图用C ++实现的:

我有这个哈希数组,数组的每个元素都是链表的头部。它有各自的节点(数据和下一个指针)。

现在,我需要复制完整的哈希数组和每个节点指向的链表。

4 个答案:

答案 0 :(得分:2)

无论你使用哪个hashmap,我都确定它有一个拷贝构造函数,可能还有operator=

hashmap_type newMap = oldMap; // copies

就是这样。但是,C ++没有标准的哈希映射。

答案 1 :(得分:2)

在C ++中,您可以使用复制构造函数或简单赋值(使用值)来执行此操作。

例如

std::map<int,string> map1 = CreateTheMap();
std::map<int,string> map2 = map1; 
std::map<int,string> map3(map1);

答案 2 :(得分:1)

那么,您使用的哈希表实现是什么?当前版本的ISO C ++没有提供哈希表。也就是说,如果您的哈希表类没有使operator=及其复制构造函数成为私有,那么两者都将按预期运行是合理的假设。如果没有,我认为这是一个错误。

在ISO C ++ 2010中添加了std::unordered_map,但ISO C ++ 1998和ISO C ++ 1998与2003修订版没有哈希映射容器。 Microsoft提供了一个非标准的“std :: hash_map”,它们永远不应放在“std ::”命名空间中。从那以后他们把它变成了“stdext ::”(这是个好消息)。其他一些供应商复制了MSFT以使其编译器兼容。

如果您急于立即使用哈希表实现,请使用boost::unordered_map中的Boost C++ Libraries。 Boost C ++库是开源的,非常受欢迎且质量很高。

修改
根据您更新的问题,您需要创建自己的复制构造函数,交换函数和operator =的实现,以便执行此操作。一旦你有交换和复制构造函数,通常operator =是微不足道的。以下是如何执行此操作的草图:

template<typename T>
HashTable<T>::HashTable(const HashTable<T>& o)
{
   // pseudo code:
   //     initialize as in HashTable<T>::HashTable()
   //     for each key/value pair in o:
   //        insert that key/value pair into this instance
   //
   // NOTE:
   //     if your hash table is sized so that the number of
   //     elements is a prime number, you can do better
   //     than the pseudo-code given above, but otherwise
   //     copying element by element is the way to go.
   //

   // BEGIN YOUR CODE
   // ...
   // END YOUR CODE
}

template<typename T> HashTable<T>&
HashTable<T>::swap(HashTable<T>& o)
{
     // Swap data pointers
     T* datatmp = _data;
     _data = o._data;
     o._data = datatmp;

     // Swap capacity
     size_t captmp = _capacity;
     _capacity = o._capacity;
     o._capacity = captmp;

     // Swap other info
     // ...

     // Report self
     return *this;
}
template<typename T> HashTable<T>&
HashTable<T>::operator=(const HashTable<T>& o)
{
     HashTable<T> cpy(o);
     return swap(cpy);
}

您必须从上面签名并将其添加到您的声明中。我还应该指出,operator=倾向于在交换方面实现的一个原因是,它不仅非常简单,而且交换功能使得代码在需要该操作时非常快,但是也是出于异常安全的目的...你的交换几乎不会失败,但是复制构造可能......所以如果复制构造抛出异常,你就没有把对象的状态抛到地狱。

答案 3 :(得分:0)

我害怕,不知何故,您正在使用自定义HashMap类,因为您谈论其实现细节。

在C ++中,当涉及复制类时,有一个特殊用途Copy Constructor,其语法如下:

class Foo
{
public:
  Foo(); // regular constructor

  Foo(const Foo& rhs); // copy constructor
};

可以使用以下任一语法调用它:

Foo copy(original);
Foo copy2 = original;

现在,如果HashMap没有提供复制构造函数,我的第一个建议就是切换到现有的实现,例如boost::unordered_mapstd::hash_mapstd::tr1::hash_mapstd::tr1::unordered_map。有std::种可能性的原因可能是许多STL在标准化之前很久就有hash_mapunordered_map虽然可以留下,但也可以提升。

如果你无法切换,你必然会以某种方式实施复制操作。