【问题标题】:A map containing std::strings and std::vector<Another_Struct> [closed]包含 std::strings 和 std::vector<Another_Struct> 的映射 [关闭]
【发布时间】:2014-07-08 22:10:39
【问题描述】:

我真的要在这里绞尽脑汁了,因为我的代码似乎无法正常工作。我有一个包含元素的结构(称为结构 A)。

我有另一个结构 (B),如下所示:

struct B
{
    std::string m_strID;
    std::map<std::string, std::vector<A>> m_mmap;
    std::map<std::string, std::vector<A>> m_mmap1;

    B()
    {   
    }
};

我试图以此为例来填充地图(比如 b 是 B 的实例和 A 类型的实例):

b[a[i].anElement].m_mmap[a[i].anElement].push_back(a[i]);

这是在一个 for 循环中,我希望将 A 的实例添加到地图的值(这是一个向量)中......但事实并非如此,那里总是有 1 个元素虽然我有 672 个实例应该在里面:(((((有什么帮助吗?

【问题讨论】:

  • b.m_mmap[aVariableOfTypeA[i].anElement].push_back(fTypeA[i]);
  • 你在……真的把你的脑袋砸坏了??住手!!
  • 请不要将变量命名为m_mmapm_mmap1
  • 这是一个简单的例子——我没有。

标签: c++ vector map struct


【解决方案1】:

首先使用typedef:

struct B
{
   std::string m_strID;
   typedef std::vector<A> VectorOfA;
   typedef std::map<std::string, VectorOfA> MyMap;
   MyMap m_mmap;
   MyMap m_mmap1;

   B()
   {    
   }
};

它不仅可以节省打字时间,还可以使您的程序更具可读性且不易出错。

填充:

B b;
...
b.m_mmap[ aVariableOfTypeA[i].anElement ].push_back( aVariableOfTypeA[i] );

你说b是B类型的实例,所以没有理由将[]应用于b,因为它不是数组也不是容器。

现在typedef 还可以帮助您了解代码中的问题以及为什么您只能看到大小 1:

B b;
std::cout << "size of map: " << b.m_mmap.size() << std::endl;
B::VectorOfA &vref = b.m_mmap[ somestring ];
std::cout << "size of vector:" << vref.size() << std::endl;
A &aref = v[0]; // first element 

该代码应该可以帮助您了解哪个类型在哪里

【讨论】:

  • 我个人觉得std::vector&lt;A&gt;VectorOfA 更易读!不过MyMap 是个好主意。
  • @MattMcNabb 这里没有太多选择,因为类的名称 A 不是一个好主意。为该类型使用更好的名称,例如Person,该类型可以称为Persons。但这里更多的是展示原理而不是好名字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多