【问题标题】:Using a map with key-string with redundant information?使用带有冗余信息的键字符串的映射?
【发布时间】:2014-09-08 11:29:30
【问题描述】:

我有一堂课myClassmyClass 对象有一个(人类可读的)名称,以及更多信息。

class myClass
{
    std::string name;
    int attribute;
    int anotherAttribute;
}

它们存储在 STL 容器中,例如 vector

std::vector<myObject> myList;

当客户端想要访问一个元素时,它会通过名称来执行此操作。这意味着,我必须遍历整个向量才能找到正确的对象(容器包含大约几百个对象)。 所以,我正在考虑将std::map 作为容器,而不是vector。据我了解,当按名称而不是索引访问元素时,地图应该是首选容器。

但是,对象的名称会存储两次,一次作为映射键,一次存储在对象本身中。内存开销应该没问题,但我想知道这是否是一个好习惯。可能存在名称不同步的问题(出于某种神秘原因)。我什至考虑过删除myClassname 成员。

简而言之:我应该使用什么容器,为什么?

【问题讨论】:

  • 您可以按名称对std::vector&lt;myObject&gt; 元素进行排序并使用二分查找,顺便说一下,二分查找的时间复杂度与std::map 相同。
  • 如果你使用 C++11,你可以使用std::unordered_map,这是一个哈希映射实现。然后从 myClass 中删除 name 属性,因为无论如何您都可以通过地图获得它。

标签: c++ vector map stl containers


【解决方案1】:

您应该根据您在其中存储和访问数据的方式来选择您的容器。因此,在您的用例中,您绝对应该使用unordered_map

当且仅当您在类中使用 std::string name 属性时,您应该在类中保留它。

所以问题是你在任何时候都必须从对象中获取名称,而不是从名称中获取对象。 当您从容器中获取对象并将其存储在其他地方,然后稍后使用它时,就会发生这种情况。

鉴于name 的性质(很可能不会改变),您不必担心name 属性与您在unordered_map 中使用的密钥不“同步”

如果内存不是主要问题,我建议您保留它。

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多