【问题标题】:Efficient way to map unique and duplicate value. Where key or value can be access映射唯一和重复值的有效方法。可以访问键或值的位置
【发布时间】:2018-09-26 16:46:51
【问题描述】:

有n个字符串需要映射到另一个字符串。

Ex :     Bacardi_old - > Facundo 
         Smirnoff_old -> Pyotr 
         Seagram_old  -> Joseph
         This keep on ..... may be around 1000

有些字符串需要用重复的字符串进行映射。

Ex :     Bacardi_new  -> Facundo 
         Smirnoff_new -> Facundo 
         Seagram_new  -> Facundo 

要求:如下例

案例1:品牌名称输入时。所有者名称作为输出。

input : Bacard_old
output: Facundo

案例2:当所有者名称输入品牌名称作为输出时。

input : Facundo
output : Bacardi_old, Bacardi_new ,Smirnoff_new ,Seagram_new 

我的方法:

1.我有一张地图如下:

std::map<std::string,std::vector<std::string>> Mymap;

2.我应该创建两张地图,一张是唯一的,另一张是重复的

std::map<std::string,std::string>Mymap
std::map<std::string,std::vector<std::string>>Mymap

就所有方面而言,第二个选项是否比第一个好。 请提出最佳方法。

注意:我坚持使用 c++11。没有 boost 库。

【问题讨论】:

  • 我已经提到我坚持使用 c++11,因为不允许使用 boost 库
  • 感谢您相应地更新问题(之前没有提到提升)。不过,boost 和 c++11 之间不一定存在因果关系。 boost 在 c++11 出现之前就已经存在了
  • 如果您可以按键或按值搜索,那么仅使用 map> 并将品牌和所有者作为键并保持两个向量都是最新的。只有一个映射比两个映射内存少,但仍然有两个插入而不是一个。我认为这是一个很好的妥协。如果您担心所有者可能与品牌同名,您可以在密钥前面加上“品牌:”或“所有者:”。

标签: c++ c++11 stdmap


【解决方案1】:

最佳方法取决于您的需求。您对访问速度或插入速度感兴趣吗?或者您有兴趣减少使用的内存空间吗?

您提出的第一个解决方案(key=brand 和 value=owner 的地图)使用较少的内存,但需要完全扫描才能按所有者执行搜索。

第二种解决方案:

  • key=brand 和 value=owner 的地图
  • key=brand 和 value= 所有者列表的地图

按所有者搜索和按品牌搜索都更快。但是,它需要更多内存,并且您还需要为每个新对执行 2 次插入。

【讨论】:

  • 对访问速度和插入速度感兴趣
  • 保持简单,第二种解决方案在访问和插入速度方面更好。您希望避免对地图进行全面扫描(这需要的时间会随着地图中元素数量的增加而增加)。
【解决方案2】:

最好是高度相关的 :)

您也可以使用std::multimap

std::multimap<std::string,std::string> my_map;
my_map.insert(std::make_pair("owner_name", "brand_name"));

现在您可以根据需要根据keyvalue 进行搜索。

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多