【问题标题】:STL Type for mapping one-to-one relations?用于映射一对一关系的 STL 类型?
【发布时间】:2019-06-21 05:45:21
【问题描述】:

在考虑我的代码关于一对一关系的设计决策时,我开始考虑是否应该使用 std::vector<std::pair<T1, T2>> 而不是 std::map<T1, T2>,并自己实现两种方法 A 到 B 和 B 到 A。

我不能使用 boost,所以我找到的这个问题的答案 (One-to-one relation in STL terms) 不太合适。

是否有一些 STL 等价物做这项工作?或者你认为向量是一个坏主意?结构(

【问题讨论】:

  • 您需要哪些方式的关联性?您只想查找T2 以查找任何T1 还是查找T1 以查找任何T2?单个std::map 和朋友不会给你后者。此外,如果您担心性能,您可能不得不尝试不同的选项。
  • 是的,查找将是双向的。我认为可读性也很重要。这是一个艰难的决定,我想我会坚持使用 vector>..
  • 从长远来看,将您最终使用的任何内容包装在您自己的类型中可能会有所回报。 STL 没有为您准备好的解决方案,因此使用定义的语义编写自己的类会更干净(即使它确实在幕后使用了 STL)。
  • 只有不到十个条目,即使是线性搜索也应该很快。您绝对应该包装它,但实现可能会保持幼稚。更有效的一种或一种用于更多元素的方法在很大程度上取决于所涉及的类型、它们有多大(例如,那些整数或 100kB 结构)等。
  • 是的,我坚持将它包装在一个有两个方法“toA(B)”和“toB(A)”的类中。如果我必须再次使用它,我想我会做它的模板版本。 (这些方法只是 std::find_if 在里面的向量上)

标签: c++ c++11 stl containers bimap


【解决方案1】:

我认为在你的情况下,你可以试试std::unordered_map<T1,T2>std::unordered_map<T2,T1>。通过使用两个 unordered_map,您可以在 O(1) 时间内完成 A2B 和 B2A,这比 map 或 vector 更快。

【讨论】:

  • 不一定更快。 unordered_map 需要用存储桶实现,所以它基本上看起来像 vector<list>,它的缓存位置很差。它可以根据很多参数更快,但它不必...
猜你喜欢
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多