【问题标题】:Which is the best container for finding and inserting?哪个是查找和插入的最佳容器?
【发布时间】:2020-09-12 18:50:17
【问题描述】:

我需要在一个容器中插入许多项目。如果一个项目已经在容器中,不要插入。我需要做多次。这些项目不需要排序。
我很困惑是使用 set(binary tree) 还是 unordered_set(hash table)。既然我的物品是独一无二的,那么哈希表的效率会降低吗?

【问题讨论】:

  • 除非您有充分的理由不这样做,否则请使用std::vector(或std::array)。
  • 只要使用unordered_set

标签: c++ data-structures stl containers


【解决方案1】:

既然你说

  • 您不需要订购商品
  • 你不想重复

最合乎逻辑的容器是一个集合。

没有必要使用std::set,因为它试图保持秩序(你说你不需要)。

std::unordered_set 是一个不错的选择,因为它可以快速插入并检查项目是否在集合中。

【讨论】:

    【解决方案2】:

    unordered_set 比 set 更好,因为您不需要对元素进行排序。对于查找和插入算法,unordered_set 时间复杂度为 O(1) ;设置为 O(log(N))。所以在这种情况下应该更喜欢使用unordered_set。

    【讨论】:

      【解决方案3】:

      使用sdt::map

      struct data_t
      {
          int value;
          data_t(): value(-1){} // default value should be invalid for any other values
      };
      
      std::map<std::string, data_t> datamap;
      int yourvalue = 100;
      int value = datamap["item"].value;
      
      if (value == -1) {
          datamap["item"].value = yourvalue;
      } else {
          //Already exists
      }
      

      【讨论】:

      • 这个问题没有提到需要任何关联性,所以map 似乎有点矫枉过正。此外,我认为建议使用“默认值”作为哨兵检查并不是一个好主意。 C++ 有更好的工具来表示未设置的值(例如 std::optional),而标记值使“垃圾输入,垃圾输出”场景变得非常容易,其中 .value 可能被忘记检查
      猜你喜欢
      • 2011-06-24
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多