2010-03-26 192 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雖然在這裏住,但是也有助推。

如果不能切換,你一定會以某種方式執行復制操作。