Хорошо, какую реализацию хеш-таблицы вы используете? В текущей версии ISO C ++ нет хеш-таблицы. Тем не менее, если ваш класс хеш-таблицы не делает operator=
и его конструктор копирования закрытым, то разумно было бы предположить, что оба будут вести себя так, как ожидается. Если нет, я бы посчитал это ошибкой.
В качестве дополнения std :: unordered_map добавляется в ISO C ++ 2010, но ISO C ++ 1998 и ISO C ++ 1998 с поправками 2003 года не имеют контейнера хэш-карты. Microsoft предоставила нестандартное std :: hash_map, которое они никогда не должны были помещать в пространство имен std ::. С тех пор они переместили его в "stdext ::" (что является хорошей новостью). Некоторые другие поставщики скопировали MSFT для совместимости своих компиляторов.
Если вам не терпится использовать реализацию хэш-таблицы сразу, используйте boost :: unordered_map из Boost C ++ Libraries . Библиотеки Boost C ++ имеют открытый исходный код, очень популярны и отличаются высоким качеством.
РЕДАКТИРОВАТЬ
Основываясь на вашем обновленном вопросе, вам нужно будет создать свой собственный конструктор копирования, функцию подкачки и реализацию operator =, чтобы сделать это. Обычно 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;
}
template<typename T> HashTable<T>&
HashTable<T>::operator=(const HashTable<T>& o)
{
HashTable<T> cpy(o);
return swap(cpy);
}
Вы должны будете взять подписи из вышеперечисленного и добавить их в свою декларацию. Я также должен отметить, что одна из причин того, что operator=
имеет тенденцию реализовываться в терминах подкачки, заключается в том, что она не только очень проста, а наличие функции подкачки делает ваш код очень быстрым, когда требуется эта операция, но также и для в целях безопасности исключений ... ваш своп должен почти никогда не заканчиваться неудачей, но конструкция копирования может ... так что, если конструкция копирования вызывает исключение, вы не бросили состояние объекта в ад.