Скопируйте хеш-таблицу в другую, используя c ++ - PullRequest
2 голосов
/ 26 марта 2010

Я начинаю с c ++ и мне нужно знать, каким должен быть подход для копирования одной хеш-таблицы в другую хеш-таблицу в C ++?

Мы можем легко сделать это в Java, используя: HashMap copyOfOriginal=new HashMap(original);

Но как насчет C ++? Как мне это сделать?

UPDATE

Ну, я делаю это на самом базовом уровне, возможно, пример с Java был неправильным. Вот что я пытаюсь реализовать, используя C ++:

У меня есть этот хэш-массив, и каждый элемент массива является заголовком связанного списка. Который имеет свои отдельные узлы (данные и следующий указатель).

А теперь мне нужно скопировать полный хэш-массив и связанный список, на который указывает каждый узел.

Ответы [ 4 ]

2 голосов
/ 26 марта 2010

В C ++ вы должны использовать либо конструктор копирования, либо простое присваивание (со значениями) для выполнения этого.

Например

std::map<int,string> map1 = CreateTheMap();
std::map<int,string> map2 = map1; 
std::map<int,string> map3(map1);
2 голосов
/ 26 марта 2010

Какую бы хэш-карту вы не использовали, я уверен, что у нее есть конструктор копирования и, возможно, operator=.

hashmap_type newMap = oldMap; // copies

И это все. C ++ не имеет стандартной хэш-карты.

1 голос
/ 26 марта 2010

Хорошо, какую реализацию хеш-таблицы вы используете? В текущей версии 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= имеет тенденцию реализовываться в терминах подкачки, заключается в том, что она не только очень проста, а наличие функции подкачки делает ваш код очень быстрым, когда требуется эта операция, но также и для в целях безопасности исключений ... ваш своп должен почти никогда не заканчиваться неудачей, но конструкция копирования может ... так что, если конструкция копирования вызывает исключение, вы не бросили состояние объекта в ад.

0 голосов
/ 26 марта 2010

Как-то боюсь, что вы используете пользовательский класс 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_map, std::tr1::hash_map или std::tr1::unordered_map. Возможности std:: могут быть вызваны тем, что многие функции STL имеют hash_map задолго до того, как он был стандартизирован. unordered_map здесь, чтобы остаться, хотя и повышение тоже.

Если вы не можете переключиться, вы обязаны каким-то образом выполнить операцию копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...