posts - 34,comments - 0,trackbacks - 0

1.写在前面:

queue, stack, priority_queue 都是顺序容器适配器,底层使用vector, deque,list实现。

stack所关联的基础容器vector或deque或 list

queue所关联的基础容器是list

prority_queue 所关联的基础容器是vector或deque

priority_queue<type, contain, compare> type是元素类型,contain是顺序容器, compare是排序规则 

2.1 优先级队列内的元素是简单类型,如int

默认情况下,优先级队列元素从大到小排列,类似最大堆, 队头是值最大的那个元素

int main ()
{
  int myints[]= {10,60,50,20};
  std::priority_queue<int> first;//构建一个空堆
  std::priority_queue<int> second (myints,myints+4);// 队头元素是60
}

2.2 

如何实现队头元素值最小呢?compare参数传入greator

#include <functional> // std::greator
int main ()
{
  int myints[]= {10,60,50,20};
  std::priority_queue<int, std::vector<int>, std::greater<int> >
                            third (myints,myints+4);
}

3.1优先级队列的元素类型是复合类型,如pair

默认情况下,排序规则是先按照pair的first的属性降序排列,如果first相等,则按照second属性降序排序

同理,传入std::greator后,排序规则是先按照pair的first的属性升序排列,如果first相等,则按照second属性升序排列

3.2按照特定排序规则

昨天做题时,遇到这么个问题,首先统计一个字符串的中各个字符的出现次数,存储在map中

接着把map中每个pair加到优先级队列中,排序规则是按照字符出现的次数由大到小排列

// 自定义排序类
class
mycomparison { bool reverse; public: mycomparison(const bool& revparam=false) {reverse=revparam;} bool operator() (pair<char, int>& lhs, pair<char,int>&rhs) const { if (reverse) return (lhs.second > rhs.second); // 比较结果为true时,lhs的优先级小于rhs的优先级,rhs排在前面,即升序排列 else return (lhs.second < rhs.second);// 默认情况下,比较结果为true时,lhs的优先级小于rhs的优先级,rhs排在前}
};


class Solution { public: string reorganizeString(string S) {
  map<char, int> my_map;
int length = S.size();
for(int i = 0; i < length; i++) { my_map[S[i]]++; }// 统计字符个数
priority_queue<pair<char, int>,vector<pair<char,int>> ,mycomparison> max_heap; //建立优先级队列,排序规则是按找pair的第二个元素降序排列
map<char, int>::iterator begin = my_map.begin();
for(begin; begin != my_map.end(); begin++) { max_heap.push(*(begin)); }
  ……
};

 

这段代码中,对mycomparison类的书写,核心在于重载()函数,如果函数返回值是true,则证明函数中第一个参数的优先级比第二个参数小,优先级小的就该放到后面去

这段代码还有个好处,当我传入mycomparison(true)时,此时就可以实现升序排列,提高了代码的可用行

 

posted on 2020-06-21 00:25  FizzPu  阅读(4)  评论(0编辑  收藏