2010-03-26 190 views
2

我从C++开始,需要知道,应该如何将一个哈希表复制到C++中的另一个哈希表? HashMap copyOfOriginal=new HashMap(original);使用C++将哈希表复制到另一个哈希表

但对于C++:

我们可以使用易于做到这一点在Java中?我应该怎么做呢?

UPDATE

嗯,我在一个非常基本的水平做,也许是java的例子是一个错误的人给。这是我正在尝试使用C++实现:

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

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

+0

鉴于你描述你的HashMap的内部,这听起来像一个自定义实现。可以发布其代码或将其转换为通用实现,如SGI'hash_map'或TR1'unordered_map'。 (两者都应该在GCC和MSVC中可用)。我们可以告诉的是,您的实现缺少一个重要功能。 – Potatoswatter 2010-03-26 09:09:09

回答

1

那么,哈希表您使用的实施?没有由当前版本的ISO C++提供的散列表。也就是说,如果你的散列表类没有使operator=及其拷贝构造函数是私有的,那么这将是一个合理的假设,两者都会按预期行事。如果没有,我会认为它是一个错误。

另外std::unordered_map正在ISO C++ 2010中添加,但ISO C++ 1998和ISO C++ 1998在2003修正中没有哈希映射容器。微软提供了一个非标准的“std :: hash_map”,它们不应该放在“std ::”命名空间中。他们后来将它移到“stdext ::”(这是个好消息)。其他一些供应商抄袭了MSFT以使他们的编译器兼容。

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

编辑
基于更新后的问题,您将需要创建自己的拷贝构造函数,交换功能,和运营商的执行=才能做到这一点。通常情况下,运营商=是微不足道的,一旦你有交换和复制构造函数就位。这里是你会怎么做这个草图:

 
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=倾向于在交换方面实施的一个原因是,它不仅非常简单,而且具有交换功能使得您的代码在需要该操作时非常快速,而且还用于该目的异常安全......你的交换几乎不会失败,但是复制构造可能......所以如果复制构造抛出一个异常,你还没有把对象的状态抛到地狱。

+1

公平起见,Dinkumware出货的STL包括hash_map,原因是它存在于SGI的原始STL中。 – 2010-03-26 04:36:55

2

无论你正在使用什么hashmap,我确定它有一个复制构造函数,可能operator=

hashmap_type newMap = oldMap; // copies 

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

+2

@stefanB,不,你错了。 std :: unordered_map被添加到C++ 0x中,但ISO C++ 1998(w/2003修正版)中没有散列映射类。 – 2010-03-26 04:29:40

+0

STL不是C++。 C++没有标准哈希映射,尽管一旦C++ 0x定稿后'std :: unordered_map'将填充该空格。 – 2010-03-26 04:33:00

+2

@Dennis,STL是C++语言的一部分......标准库与C++一样,也是语言语法和语义的一部分,并且被相同的标准化过程所采用。 – 2010-03-26 04:34:10

2

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

例如

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

std :: map不是哈希映射。 – 2010-03-26 04:28:07

+1

好的,用'unordered_map'替换。 – 2010-03-26 04:30:38

+0

@Michael,这看起来更像是一个普遍的问题。我不认为OP正在寻找一个包含完全匹配Java语义的C++类型的示例。 – JaredPar 2010-03-26 04:32:03

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_map如果可用std::hash_mapstd::tr1::hash_mapstd::tr1::unordered_map。原因很可能是std::的可能性是许多STL在标准化之前很久就有一个hash_mapunordered_map虽然在这里住,但是也有助推。

如果不能切换,你一定会以某种方式执行复制操作。