【问题标题】:How to create the map Of the vector of structure in c++如何在c ++中创建结构向量的映射
【发布时间】:2020-10-26 04:45:51
【问题描述】:

我有一张地图std::map<int, std::vector<Data>>myMap,我的结构定义如下。

        struct Data
        {
         int x;
         int z;
         int y;
        };

在 myMap 中,键是 int,值是结构向量,我不想在插入地图时创建临时向量或结构。有什么想法可以实现吗?

【问题讨论】:

  • myMap[123] 返回对该键处向量的引用(如果它不存在则创建它),因此myMap[123].push_back({x,y,z}); 应将{x,y,z} 添加到新创建/现有的向量中,而不使用临时向量。类似onlinegdb.com/HJgoqrElkw

标签: c++ struct stdvector stdmap


【解决方案1】:

一种方法是使用emplace和std::move

myMap.emplace(key, std::move(myVec));

通过使用std::move,您可以在地图之外构建矢量,然后将该矢量移动到地图中而无需任何复制。

【讨论】:

    【解决方案2】:

    正如前面的答案所说,您可以使用 emplace 和 std::move,但要测试它或任何其他解决方案是否有效,我建议您覆盖构造函数、复制构造函数、析构函数和赋值运算符以打印类似分别创建、复制、销毁、分配,让您了解实际情况并提高性能。

    【讨论】:

      【解决方案3】:

      您不需要在地图中显式初始化值。当您通过 operator[] 访问映射中不存在的键时,将添加默认初始化值(在您的情况下为空的 std::vector)。

      所以你可以安全地做类似的事情

      myMap[0].push_back(myInstanceOfData)
      

      即使密钥 0 不存在。然后它将与一个空向量一起创建为值,并将值myInstanceOfData 推送到地图内的这个新向量。

      【讨论】:

      • 我不想创建额外的向量对象。我想直接插入地图而没有向量的任何对象。最好使用初始化列表
      • 您不要在这里创建额外的对象。您只有存储在地图中的对象。 “直接插入地图而不包含任何矢量对象” - 抱歉,不知道你的意思,你有一张以std::vector 为值的地图,你会总是 i> 将std::vector 存储在地图中,因为这就是您声明它的方式。
      猜你喜欢
      • 1970-01-01
      • 2011-02-09
      • 2023-03-18
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多