Cur*_*ous 12 c++ heap stl priority-queue c++11
有没有理由让std::priority_queue构造函数通过常量引用接受比较器?如果比较器超出范围怎么办?
在@LightnessRacesInOrbit指出的可能移动比较器的情况下,我正在考虑这个问题!
如果已有关于此事的帖子,我很抱歉.我一直都找不到它!
我以前从未真正想过这个,而const-ref确实有点误导.然而,在移动语义出现之前就已经想到了函数签名,并且随着价值接受一切变得时髦.的确,比较器被复制了!
[C++14: 23.6.4.1/4]:效果:初始化comp用x和c与y(复制构建或移动构建适当的); 电话c.insert(c.end(), first, last);和最后的电话make_heap(c.begin(), c.end(), comp).
Lambda不是可复制的,但它们是可复制构造的,因此这里没有问题.
[C++14: 5.1.2/20]:与lambda表达式关联的闭包类型具有已删除(8.4.3)的默认构造函数和已删除的复制赋值运算符.它有一个隐式声明的复制构造函数(12.8),并且可能有一个隐式声明的移动构造函数(12.8).[..]
这会阻止比较器本身的移动构造吗?是的,它确实.我将假设这个约定由const-ref然后复制它的比较,源于STL时代,在移动语义之前的方式.我想没有认真考虑添加重载以按比较取值,因为这增加了复杂性,你首先不应该有一个复杂的,可移动的比较器(给它们状态,肯定,但不要太多) .尽管如此,如果您能够提出一个可靠的用例来移动比较器,这可能值得委员会提高.
它不会超出范围 - 它是复制构造到容器中.cppreference.com上的描述说明:
explicit priority_queue( const Compare& compare = Compare(),
const Container& cont = Container() );
Run Code Online (Sandbox Code Playgroud)
使用cont的内容复制构造底层容器c.复制 - 构造比较函子comp与compare的内容.调用std :: make_heap(c.begin(),c.end(),comp).这也是默认构造函数.
构造函数有各种其他形式,但在所有情况下,内部比较器都是从提供的构造器复制或移动构造的.
| 归档时间: |
|
| 查看次数: |
568 次 |
| 最近记录: |