Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用c++; 我从C++开始,需要知道,在C++中,应该把一个哈希表复制到另一个哈希表的方法是什么?_C++_Hashtable - Fatal编程技术网

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

使用c++; 我从C++开始,需要知道,在C++中,应该把一个哈希表复制到另一个哈希表的方法是什么?,c++,hashtable,C++,Hashtable,我们可以在java中使用:HashMap copyofooriginal=newhashmap(original) 但是C++怎么办?我该怎么做呢 更新 嗯,我是在一个非常基本的层面上做的,也许java示例给出的是一个错误的例子。这就是我试图用C++实现的: 我有这个散列数组,数组的每个元素都是链表的头。它有它的单个节点(数据和下一个指针) 现在,我需要复制完整的哈希数组和每个节点指向的链表。无论您使用哪个哈希映射,我确信它都有一个复制构造函数,可能还有一个操作符= hashmap_type n

我们可以在java中使用:
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;