C++:explicit关键字、左右值、类型转换
C++11新特性:变参模板、完美转发和emplace
使得 emplace 可以接受任意参数,这样就可以适用于任意对象的构建。
《C++Primer》:
新标准引入了三个是新成员——emplace、emplace_front和emplace_back,这些操作构造而不是拷贝元素。这些操作分别对应着,insert、push_front、push_back,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。
当我们调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数。emplace成员使用这些参数在容器管理的内存空间中直接构造元素。
问题代码如下:
1 |
|
将对应的学生对象直接放入容器中会调用拷贝构造函数,拷贝一份放入容器中,引起了性能问题。
用变参模板和完美转发来解决这个问题。
1 | vectStu.emplace_back(20, "小花"); |
变参模板——就是()中的参数。与该类有参构造函数参数相同。
完美转法——用上面这个参数私底下去调用该类的构造函数,构造一个对象放入到容器中。
1 | vectStu.emplace_back();//相当于push_back |
如果发现还会出现多次调用情况,那是因为先放入了一个元素,然后由于空间不够,又重新开辟了一块新的空间,并且将原来的数据拷贝了过来。
这就是为什么vector容器在中间插入、删除元素挺费时的原因。
补充:
1 | 不同容器相关用法有所不同 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 半生瓜のblog!