使用C++将哈希表复制到另一个哈希表
我从C++开始,需要知道,应该如何将一个哈希表复制到C++中的另一个哈希表? HashMap copyOfOriginal=new HashMap(original);
使用C++将哈希表复制到另一个哈希表
但对于C++:
我们可以使用易于做到这一点在Java中?我应该怎么做呢?
UPDATE
嗯,我在一个非常基本的水平做,也许是java的例子是一个错误的人给。这是我正在尝试使用C++实现:
我有这个哈希数组,并且数组的每个元素都是链表的头部。它具有单独的节点(数据和下一个指针)。
现在,我需要复制每个节点指向的完整散列数组和链接列表。
那么,哈希表您使用的实施?没有由当前版本的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=
倾向于在交换方面实施的一个原因是,它不仅非常简单,而且具有交换功能使得您的代码在需要该操作时非常快速,而且还用于该目的异常安全......你的交换几乎不会失败,但是复制构造可能......所以如果复制构造抛出一个异常,你还没有把对象的状态抛到地狱。
公平起见,Dinkumware出货的STL包括hash_map,原因是它存在于SGI的原始STL中。 – 2010-03-26 04:36:55
无论你正在使用什么hashmap,我确定它有一个复制构造函数,可能operator=
。
hashmap_type newMap = oldMap; // copies
就是这样。不过,C++没有标准哈希映射。
@stefanB,不,你错了。 std :: unordered_map被添加到C++ 0x中,但ISO C++ 1998(w/2003修正版)中没有散列映射类。 – 2010-03-26 04:29:40
STL不是C++。 C++没有标准哈希映射,尽管一旦C++ 0x定稿后'std :: unordered_map'将填充该空格。 – 2010-03-26 04:33:00
@Dennis,STL是C++语言的一部分......标准库与C++一样,也是语言语法和语义的一部分,并且被相同的标准化过程所采用。 – 2010-03-26 04:34:10
在C++中,您可以使用复制构造函数或简单赋值(使用值)来执行此操作。
例如
std::map<int,string> map1 = CreateTheMap();
std::map<int,string> map2 = map1;
std::map<int,string> map3(map1);
std :: map不是哈希映射。 – 2010-03-26 04:28:07
好的,用'unordered_map'替换。 – 2010-03-26 04:30:38
@Michael,这看起来更像是一个普遍的问题。我不认为OP正在寻找一个包含完全匹配Java语义的C++类型的示例。 – JaredPar 2010-03-26 04:32:03
我很害怕,不知何故,你正在使用一个定制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_map
,std::tr1::hash_map
或std::tr1::unordered_map
。原因很可能是std::
的可能性是许多STL在标准化之前很久就有一个hash_map
。 unordered_map
虽然在这里住,但是也有助推。
如果不能切换,你一定会以某种方式执行复制操作。
鉴于你描述你的HashMap的内部,这听起来像一个自定义实现。可以发布其代码或将其转换为通用实现,如SGI'hash_map'或TR1'unordered_map'。 (两者都应该在GCC和MSVC中可用)。我们可以告诉的是,您的实现缺少一个重要功能。 – Potatoswatter 2010-03-26 09:09:09