【问题标题】:What's the use of passing a container to priority_queue将容器传递给priority_queue有什么用
【发布时间】:2015-11-25 22:19:21
【问题描述】:

每次你想为priority_queue 使用自定义比较函数时,你也必须传递一个容器。在我看来,您应该始终将 vector<T> 传递给它。现在起初我认为这是某种冗余,但事实并非如此。将容器传递给priority_queue 有什么用,我该如何使用它?

【问题讨论】:

  • 我不喜欢你的vector<T>。我想使用我自己的vector<T, MyAlloc<T>>。为什么要禁止这样做?

标签: c++ data-structures stl containers priority-queue


【解决方案1】:

std::priority_queue 是一个容器适配器。它实际上并不知道如何存储您放入其中的元素;它将其委托给一个真实的容器,例如std::vector。您很少会想要使用 std::vector 以外的其他内容作为底层容器,但如果您愿意,可以使用 std::deque

std::vector 是默认值,但由于这是第二个模板参数,如果你想为第三个模板参数使用非默认值,你必须指定第二个,就像函数参数一样.

【讨论】:

  • 另外值得一提的是,优先级队列实际上是二进制堆,而后者通常是在一个连续的存储中实现的,比如数组或者std::vector
【解决方案2】:

您只需将底层容器类型传递给它,默认情况下,它是std::vector<T>。如果您想保留默认行为,那么您可以始终传递std::vector<T> 是正确的。您还可以使用std::deque<T>,或任何公开以下功能的自定义容器:

  • 空()
  • 尺寸()
  • 前()
  • push_back()
  • pop_back()

但是为什么在指定比较器之前必须指定容器呢?好吧,它只与参数的定义方式有关。 containercompare 都是默认参数,而 container 恰好排在第一位。由于 C++ 的工作方式,您只需在传递它之前传递导致 compare 的所有参数,这意味着您还必须传递 container。 AFAIK 与 compare 无关,需要了解有关 container 的任何信息。

【讨论】:

  • 原因是使用的比较器是容器自带的——保留两个比较器并忽略其中一个是没有意义的。
猜你喜欢
  • 2017-11-26
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 2013-02-06
相关资源
最近更新 更多