以指针为键复制 std::map

copying std::map with pointer as key

提问人:user11508332 提问时间:8/2/2020 最后编辑:Aykhan Hagverdiliuser11508332 更新时间:8/2/2020 访问量:277

问:

如果我有以下 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" }
  }
}

由此,完全相同的地址将存储在密钥中,但我不确定如何使密钥指向不同的地址,但仍然指向相同的内容。我知道将键作为指针似乎很奇怪,但我的作业中有一个特定的原因,我需要这样做。

C++ 对象 复制构造函数

评论

0赞 cigien 8/2/2020
提供的代码根本不编译。例如: 不是一个类型。mark

答:

3赞 Łukasz Ślusarczyk 8/2/2020 #1

通过 new 和 T 的复制构造函数创建新的 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;
   }
}

评论

2赞 1201ProgramAlarm 8/2/2020
你可以通过使用一个基于范围的for循环来简化这一点。
0赞 Łukasz Ślusarczyk 8/2/2020
原始代码看起来像C++98,所以让我们接近作者可能使用的编译器。
0赞 user11508332 8/2/2020
我很确定我使用的编译器是现代的 - 你介意展示如何使用更现代的技术来做到这一点吗?
0赞 1201ProgramAlarm 8/2/2020
原始代码看起来像一堆无法编译的东西。问题本身没有标有特定的语言版本(例如 c++98),因此假设使用当前版本的语言来回答(这在 C++ 标签 wiki 中进行了解释)。