我从c ++开始,需要知道,在C ++中将一个哈希表复制到另一个哈希表的方法应该是什么?
我们可以使用:HashMap copyOfOriginal=new HashMap(original);
但是C ++怎么样?我应该怎么做呢?
更新
好吧,我是在一个非常基础的层面上做的,也许java示例是错误的。这就是我试图用C ++实现的:
我有这个哈希数组,数组的每个元素都是链表的头部。它有各自的节点(数据和下一个指针)。
现在,我需要复制完整的哈希数组和每个节点指向的链表。
答案 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_map
或std::hash_map
,std::tr1::hash_map
或std::tr1::unordered_map
。有std::
种可能性的原因可能是许多STL在标准化之前很久就有hash_map
。 unordered_map
虽然可以留下,但也可以提升。
如果你无法切换,你必然会以某种方式实施复制操作。