【问题标题】:std::vector as key in std::set and std::unordered_setstd::vector 作为 std::set 和 std::unordered_set 中的键
【发布时间】:2015-10-11 03:31:19
【问题描述】:

我正在编写一个程序来评估棋盘游戏(即 othello)中的大量位置。我的董事会代表是std::vector。由于同一位置在处理过程中可能出现更多次,因此我使用std::set<std::vector> 来存储检查的位置。

就性能而言,我不知道是否最好使用std::set(因为std::vector 实现了所需的所有运算符)或std::unordered_set 具有良好的本机 em>散列函数(即boost::hash_range(...))。

是否有其他好的解决方案可以实现相同的目标? (可能是不同的板表示[确定可用时的位板] 或不同的数据结构?)

编辑 ************************************** 编辑

这是获取板的伪代码:

enqueue initial board
while queue not empty:
    dequeue a board
    if board is already examined: //std::set search
        continue
    put board in examined boards
    if board is solved:
        print solution
    else:
        for each possible board that can arise out of this one:
            add board to end of queue

【问题讨论】:

  • 为什么不是向量的向量?
  • 如果你在谈论性能,你需要衡量什么是快速解决你的问题。如果可能的话,std::vector 应该是比较的候选对象。
  • @NathanOliver 带有一个向量检查是否已经检查了一个位置需要 O(n)。使用集合 O(logn) 和 unsorted_set O(1)。当 n 非常大时,向量是一个瓶颈
  • 我认为您的问题需要更多解释/示例,因为我不清楚您要做什么。
  • @NathanOliver 我用伪代码改进了这个问题:)

标签: c++ c++11 boost vector stl


【解决方案1】:

Why on earth would anyone use set instead of unordered_set?

what is the difference between set and unordered_set in C++?

基本上:除非您担心值的顺序,否则您可能应该使用 unordered_set。

但对于所有其他性能问题:如有疑问 --> 开始测量。 实现“less”和“hash”,然后对这两个类进行尝试并检查哪个表现更好(注意:在这种情况下,无论如何您都没有几乎相同的 API。所以切换类应该不会花很长时间测试)

【讨论】:

  • @celticminstrel 是的,是的。没有理由再次定义它
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 2023-04-09
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多