那么,哈希表您使用的实施?没有由当前版本的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