копирование std :: map с указателем в качестве ключа - PullRequest
0 голосов
/ 01 августа 2020

Если у меня есть следующий класс C ++:

template <typename T>
class my_class {
 public:
 private:
  struct assessment {
    int mark;
    String grade;
  } std::map<T*, mark> class_map;
}

Если бы я делал глубокую копию с конструктором копирования, как бы я мог убедиться, что содержимое указателей в ключах копируется, в то время как также убедитесь, что каждый ключ соответствует той же структуре оценки, что и значение? В настоящее время у меня есть:

my_class(my_class const& other) {
  typename std::map<T*, mark>::iterator it = other.class_map.begin();
  while (it != other.class_map.end()) {
    class_map[it->first] = Struct assessment { 70, "Credit" }
  }
}

Из этого в ключе будут храниться одни и те же адреса, но я не уверен, как сделать так, чтобы ключи указывали на разные адреса, но все же указывают на то же содержание. Я знаю, что использование ключей в качестве указателей кажется странным, но в моем назначении есть особая причина, по которой мне это нужно.

1 Ответ

3 голосов
/ 01 августа 2020

Создать новые объекты T с помощью new и конструктора копирования T. Но имейте в виду, что этот порядок на карте будет потерян на скопированной карте.

my_class(my_class const& other) {
   auto it = other.class_map.begin();
   while (it != other.class_map.end()) {
      T* newKey = new T(*it->first);
      class_map[newKey] = it->second;
      ++it;
   }
}
...