那麼,哈希表您使用的實施?沒有由當前版本的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=
傾向於在交換方面實施的一個原因是,它不僅非常簡單,而且具有交換功能使得您的代碼在需要該操作時非常快速,而且還用於該目的異常安全......你的交換幾乎不會失敗,但是複製構造可能......所以如果複製構造拋出一個異常,你還沒有把對象的狀態拋到地獄。
鑑於你描述你的HashMap的內部,這聽起來像一個自定義實現。可以發佈其代碼或將其轉換爲通用實現,如SGI'hash_map'或TR1'unordered_map'。 (兩者都應該在GCC和MSVC中可用)。我們可以告訴的是,您的實現缺少一個重要功能。 – Potatoswatter 2010-03-26 09:09:09