淫领全球C++priority_queue(STLpriority_queue)⽤法详解
不出所料,priority_queue 容器适配器定义了⼀个元素有序排列的队列。默认队列头部的元素优先级最⾼。因为它是⼀个队列,所以只能访问第⼀个元素,这也意味着优先级最⾼的元素总是第⼀个被处理。但是如何定义“优先级”完全取决于我们⾃⼰。如果⼀个优先级队列记录的是医院⾥等待接受急救的病⼈,那么病⼈病情的严重性就是优先级。如果队列元素是银⾏的借贷业务,那么借记可能会优先于信贷。
虑怎么组词
priority_queue 模板有 3 个参数,其中两个有默认的参数;第⼀个参数是存储对象的类型,第⼆个参数是存储元素的底层容器,第三个参数是函数对象,它定义了⼀个⽤来决定元素顺序的断⾔。因此模板类型是:
template <typename T, typename Container=std::vector, typename Compare=std::less> class priority_queue
如你所见,priority_queue 实例默认有⼀个 vector 容器。函数对象类型 less 是⼀个默认的排序断⾔,定义在头⽂件 function 中,决定了容器中最⼤的元素会排在队列前⾯。fonction 中定义了 greater,⽤来作为模板的最后⼀个参数对元素排序,最⼩元素会排在队列前⾯。当然,如果指定模板的最巵⼀个参数,就必须提供另外的两个模板类型参数。
麻城龟峰山
图 1 中显⽰元素的⽅式反映了它们被检索的顺序。在 vector 中它们也可以不像这样排序。在讨论堆时,会解释原因。
创建 priority_queue
可以如下所⽰⽣成⼀个空的优先级队列:
std::priority_queue<std::string> words;
可以⽤适当类型的对象初始化⼀个优先级队列:
std::string wrds[]{"one","two","three","four"};
校园画
西边天空
戒烟茶std::priority_queue<std::string> words { std::begin(wrds),std::end(wrds)};// "two" "three" "one" "four"
初始化列表中的序列可以来⾃于任何容器,并且不需要有序。优先级队列会对它们进⾏排序。
拷贝构造函数会⽣成⼀个和现有对象同类型的 priority_queue 对象,它是现有对象的⼀个副本。例如:
std::priority_queue<std::string> copy_words {words};// copy of words
也有带右值引⽤参数的拷贝构造函数,它可以移动⼀个实参对象。
当对容器内容反向排序时,最⼩的元素会排在队列前⾯,这时候需要指定 3 个模板类型参数:
std:: string wrds[]{"one","two","three","four"};
std::priority_queue<std::string, std::vector<std::string>,std::greater<std::string>> words1 {std::begin (wrds), std:: end (wrds)};//"four" "one" "three" "two"这会通过使⽤ operator>() 函数对字符串对象进⾏⽐较,进⽽⽣成⼀个优先级队列,因此这会和它们在队列中的顺序相反。
优先级队列可以使⽤任何容器来保存元素,只要容器有成员函数 front()、push_back()、pop_back()、size()、empty()。这显然包含了deque 容器,因此这⾥也可以⽤ deque 来代替:
std::string wrds []{"one","two","three","four"};
std::priority_queue<std::string, std::deque<std::string>> words {std::begin(wrds), std::end(wrds)};
这个 words 优先级队列在 deque 容器中保存了⼀些 wrds 数组中的字符串,这⾥使⽤默认的⽐较断⾔,因此队列中的元素会和上⾯
word1 中元素的顺序相同。priority_queue 构造函数会⽣成⼀个和第⼆个类型参数同类型的容器来保存元素,这也是 priority_queue 对象的底层容器。
可以⽣成 vector 或 deque 容器,然后⽤它们来初始化 priority_queue。下⾯展⽰了如何以 vector 的元素作为初始值来⽣成
令行禁止的意思priority_queue 对象:
std::vector<int> values{21,22,12,3,24,54,56};
std::priority_queue<int> numbers {std::less<int>(),values};
priority_queue 构造函数的第⼀个参数是⼀个⽤来对元素排序的函数对象,第⼆个参数是⼀个提供初
计算机病毒的主要特征
始元素的容器。在队列中⽤函数对象对 vector 元素的副本排序。values 中元素的顺序没有变,但是优先级队列中的元素顺序变为:56 54 24 22 21 12 3。优先级队列中⽤来保存元素的容器是私有的,因此只能通过调⽤ priority_queue 对象的成员函数来对容器进⾏操作。构造函数的第⼀个参数是函数对象类型,它必须和指定的⽐较模板类型参数相同,函数对象类型默认是 less。如果想使⽤不同类型的函数,需要指定全部的模板类型参数。例如:
std::priority_queue<int, std::vector<int>,std::greater<int>> numbersl {std::greater<int>(), values};
第三个类型参数是⼀个⽐较对象类型。如果要指定这个参数,必须指定前两个参数——元素类型和底层容器类型。
priority_queue 操作
对 priority_queue 进⾏操作有⼀些限制:
push(const T& obj):将obj的副本放到容器的适当位置,这通常会包含⼀个排序操。
push(T&& obj):将obj放到容器的适当位置,这通常会包含⼀个排序操作。
emplace(T constructor a rgs…):通过调⽤传⼊参数的构造函数,在序列的适当位置构造⼀个T对象。为了维持优先顺序,通常需要⼀个排序操作。
top():返回优先级队列中第⼀个元素的引⽤。
pop():移除第⼀个元素。
size():返回队列中元素的个数。
empty():如果队列为空的话,返回true。
swap(priority_queue& other):和参数的元素进⾏交换,所包含对象的类型必须相同。
priority_queue 也实现了赋值运算,可以将右操作数的元素赋给左操作数;同时也定义了拷贝和移动版的赋值运算符。需要注意的
是,priority_queue 容器并没有定义⽐较运算符。因为需要保持元素的顺序,所以添加元素通常会很慢。稍后会在堆(heaps)⼀节讨论priority_queue 的内部操作。