【C++】可变模板参数和完美转发
C++中有一个常见的误区,在对pair处理时,有时候需要通过花括号{将pair的元素包裹起来作为参数传递,否则编译器会报错;有时候又可以直接将多个元素直接作为参数传递,编译器不会报错,例如priority_queue的emplace方法。
emplace
这个方法的作用是在priority_queue堆中插入一个元素,如果我定义的堆如下:
priority_queue<pair<int, int>>q;
那么使用emplace的情况可能就像这样:
q.emplace(nums[i], i);
那么stl内部是如何实现的呢?
STL的实现
void emplace(Args&&... args);
这段代码表示了STL内部的实现,主要奥秘在参数部分:
首先是利用了模板参数包Args,也就是说这个类不是用户自定义的而是已经封装好的,然后通过…就实现了多个参数的接收,这种手段比tuple更灵活,主要体现在:
而完美转发的存在又使得对其插入的过程中存在的拷贝占用的时间和空间大大减小,进一步提升了stl使用起来的效率。