使用c++; 我从C++开始,需要知道,在C++中,应该把一个哈希表复制到另一个哈希表的方法是什么?
我们可以在java中使用:使用c++; 我从C++开始,需要知道,在C++中,应该把一个哈希表复制到另一个哈希表的方法是什么?,c++,hashtable,C++,Hashtable,我们可以在java中使用:HashMap copyofooriginal=newhashmap(original) 但是C++怎么办?我该怎么做呢 更新 嗯,我是在一个非常基本的层面上做的,也许java示例给出的是一个错误的例子。这就是我试图用C++实现的: 我有这个散列数组,数组的每个元素都是链表的头。它有它的单个节点(数据和下一个指针) 现在,我需要复制完整的哈希数组和每个节点指向的链表。无论您使用哪个哈希映射,我确信它都有一个复制构造函数,可能还有一个操作符= hashmap_type n
HashMap copyofooriginal=newhashmap(original)代码>
<>但是C++怎么办?我该怎么做呢
更新
嗯,我是在一个非常基本的层面上做的,也许java示例给出的是一个错误的例子。这就是我试图用C++实现的:
我有这个散列数组,数组的每个元素都是链表的头。它有它的单个节点(数据和下一个指针)
现在,我需要复制完整的哈希数组和每个节点指向的链表。无论您使用哪个哈希映射,我确信它都有一个复制构造函数,可能还有一个操作符=
hashmap_type newMap = oldMap; // copies
就这样。C++没有标准的哈希映射。在C++中,你会使用复制构造函数或简单赋值(带有值)来执行这个操作。p>
比如说
std::map<int,string> map1 = CreateTheMap();
std::map<int,string> map2 = map1;
std::map<int,string> map3(map1);
std::map map1=CreateTheMap();
std::map map2=map1;
标准:map3(map1);
那么,您使用的是什么哈希表实现?当前版本的ISO C++没有哈希表。这就是说,如果您的哈希表类没有将操作符=
及其复制构造函数设置为私有,那么可以合理地假设这两个类都会按照预期的方式运行。如果不是,我会认为它是一个bug。
作为一个旁侧,在ISO C++ 2010中添加,但是ISOC++ 1998和ISO C++ 1998在2003个修正中没有哈希映射容器。微软提供了一个非标准的“std::hash_映射”,他们不应该把它放在“std::”名称空间中。此后,他们将其移至“stdext::”(这是个好消息)。其他一些供应商复制MSFT以使其编译器兼容
如果您急于立即使用哈希表实现,请使用。Boost C++库是开源的,非常流行,质量很高。
编辑
根据您更新的问题,您需要创建自己的复制构造函数、交换函数和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;
}
样板
HashTable::HashTable(常量HashTable&o)
{
//伪代码:
//在HashTable::HashTable()中初始化
//对于o中的每个键/值对:
//将该键/值对插入到此实例中
//
//注:
//如果哈希表的大小使
//元素是素数,你可以做得更好
//而不是上面给出的伪代码,但是
//一个元素一个元素地复制是一种方法。
//
//开始你的代码
// ...
//结束你的代码
}
模板哈希表&
HashTable::swap(HashTable&o)
{
//交换数据指针
T*datatmp=\u数据;
_数据=o.\U数据;
o、 _data=datatmp;
//交换容量
尺寸=容量;
_容量=o.\U容量;
o、 _容量=captmp;
//交换其他信息
// ...
//自我报告
归还*这个;
}
模板哈希表&
HashTable::operator=(常量HashTable&o)
{
哈希表cpy(o);
收益互换(cpy);
}
你必须从上面签名,并将其添加到你的声明中。我还应该指出,operator=
倾向于在交换方面实现的一个原因是,不仅交换操作非常简单,而且在需要该操作时,使用交换函数可以使代码非常快速,而且出于异常安全的目的。。。交换应该不会失败,但复制构造可能。。。因此,如果复制构造抛出异常,那么您并没有将对象的状态抛出地狱。我担心您正在使用一个自定义的HashMap
类,因为您谈到了它的实现细节
在C++中,当涉及复制一个类时,有一个特殊用途<代码>复制构造器< /C>,它的语法看起来像:
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
。之所以有这样的可能性,是因为许多STL在标准化之前很久就有了一个hash\u映射<代码>无序地图
将继续存在,而增强地图也将继续存在
如果无法切换,则必须以某种方式实现复制操作。std::map不是哈希映射。好的,用unordered_map
@Michael替换,这似乎是一个更一般的问题。我认为OP不想寻找一个例子,它包含一个与java语义匹配的C++类型。exactly@JaredPar没有完全匹配java语义的C++类型。任何关于“X类型与语言Z中的语言Y的语言语义相匹配”的问题几乎总是导致“它不存在”。不同的语言有不同的习语。我们应该使用适合该语言的习惯用法。@Billy,虽然这可能是真的,但您不会得到相同的语法或方法名称,因此我们有理由期望容器具有类似的行为和相同的渐进复杂性。std::map的运行时复杂性与boost::unordered_map(很快,std::unordered_map)和Java的HashMap非常不同。需要O(1)插入和O(1)查找是非常合理的。@stefanB,不,你错了。STD::在C++ 0x中添加了无序的映射,但是在ISO C++ 1998(W/2003个修改)中没有哈希映射类。STL不是C++。C++没有标准的哈希映射,尽管 STD::unOrdEdEdMult//Cord>将在C++ +0x完成之后填补这个空缺。@丹尼斯,STL
Foo copy(original);
Foo copy2 = original;