1、emplace_back减少内存拷贝和移动

  emplace_back能通过参数构造对象,不需要拷贝或者移动内存,相比pusk_back能更好的避免内存的拷贝和移动,使容器插入元素性能得到进一步提升。几乎所有的标准库容器都增加了类型的方法:emplace,emplace_hint,emplace_front,emplace_after和emplace_back。

  基本用法:

#include <iostream>
#include <vector> using namespace std; struct A
{
int x;
double y;
A(int a, double b): x(a), y(b){}
}; int main()
{
vector<A> v;
v.emplace_back(, 2.0); cout << v.size() << endl; return ;
}

  用法还是很简单的,直接通过构造函数的参数就可以构造对象,当然,要求对象有相应的构造函数,如果没有构造函数会报错。

  emplace_back相对push_back更有性能优势。

#include <iostream>
#include <vector>
#include <map> using namespace std; struct A
{
int x;
double y;
string name; A(int a, double b, string c):x(a), y(b), name(c)
{
cout << "construct" << endl;
} A(const A &a): x(a.x), y(a.y), name(std::move(a.name))
{
cout << "move" << endl;
}
}; int main()
{
map<int, A> m;
int i = ;
double d = 2.0;
string s = "C++11"; cout << "--insert--" << endl;
m.insert(make_pair(, A(i, d, s))); cout << "--emplace--" << endl;
m.emplace(, A(i, d, s)); vector<A> v;
cout << "--emplace_back--" << endl;
v.emplace_back(i, d, s); cout << "--push_back--" << endl;
v.push_back(A(i, d, s)); return ;
} //执行结果:
--insert--
construct
move
move
--emplace--
construct
move
--emplace_back--
construct
--push_back--
construct
move
move

  可以看出不管map还是vector,emplace系列方法在性能上面都优于之前的方法,所以尽可能的使用emplace系列方法,不过前提是类型必须有相应的构造函数。

2、unordered container无序容器

  c++11提供了无序容器unordered_map/unordered_multimap和unordered_set/unordered_multiset,由于这些容器中的元素是不排序的,所以性能高于map/multimap和set/multiset。map和set是红黑树,在插入元素时会自动排序,而无序容器内部是散列表,通过hash,而不是排序来快速操作元素,使得效率更高。

  对于自定义类型,无序容器的key需要提供hash_value函数,其他用法和map/set的用法是一样的。不过对于自定义的key,需要提供hash函数和比较函数。

  对于基本类型来说,不需要提供hash函数和比较函数,用法和map/set一样。

C11性能之道:标准库优化的更多相关文章

  1. C11性能之道:右值引用

    1.左值与右值 C++11中新增了一种类型,右值引用,标记为T &&. 首先来介绍什么是左值和右值,左值是指表达式结束后依旧存在的持久对象,而右值是指表达式结束之后就不再存在的临时对象 ...

  2. C11性能之道:转移和转发

    1.move C++11中可以将左值强制转换为右值,从而避免对象的拷贝来提升性能.move将对象的状态或者所有权从一个对象转移到另一个对象,没有内存拷贝.深拷贝和move的区别如图: 从图可以看出,深 ...

  3. python自带性能强悍的标准库 itertools

    可迭代对象就像密闭容器里的水,有货倒不出 itertools是python内置的标准模块,提供了很多简洁又高效的专用功能,使用得当能够极大的简化代码行数,同时所有方法都是实现了生成器函数,这就意味着极 ...

  4. 漫步Facebook开源C++库Folly之string类设计(散列、字符串、向量、内存分配、位处理等,小部分是对现有标准库和Boost库功能上的补充,大部分都是基于性能的需求而“重新制造轮子”)

    就在近日,Facebook宣布开源了内部使用的C++底层库,总称folly,包括散列.字符串.向量.内存分配.位处理等,以满足大规模高性能的需求. 这里是folly的github地址:https:// ...

  5. c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑

    转自:http://blog.csdn.net/truexf/article/details/17303263 一.vector vector采用一段连续的内存来存储其元素,向vector添加元素的时 ...

  6. 道可叨 | Python 标准库 urllib2 的使用细节

    道可叨 | Python 标准库 urllib2 的使用细节 request = urllib2.Request(uri) request.add_header('User-Agent', 'fake ...

  7. 《Python3 标准库》作者 道格.赫尔曼

    Doug Hellmann目前是Racemi公司的一位高级开发人员,也是Python Software Foundation的信息交流主管.从1.4版开始他就一直在做Python编程,曾在大量UNIX ...

  8. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

    内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...

  9. C++标准库之右值引用与交付语义

    C++标准委员会不应该制定一条阻止程序员拿起枪朝自己的脚丫子开火的规则. 右值引用(rvalue).交付语义(move) 最近阅读<C++标准库第二版>,看到第二章介绍C++11新特性3. ...

随机推荐

  1. Linux 添加虚拟网卡

    使用的Linux版本是Centos 7: [root@vnode33 bin]# cat /etc/redhat-release CentOS Linux release (Core) 使用ifcon ...

  2. 《C++常见问题及解答》

    一.类 1. 常数据成员的初始化只能在构造函数的初始化列表中进行 2. 静态数据成员不可以在类内初始化 3. 创建一个对象时的构造函数的调用次序:对象成员的构造函数.对象自身的构造函数 4. 创建一个 ...

  3. 3dContactPointAnnotationTool开发日志(八)

      今天上午去实验室打算把项目从github上pull下来发现貌似不行,然后强行pull下来后项目变得乱七八糟了,有的组件都不知道去哪里了.去github上看了看发现上面day6和day7都没有,特别 ...

  4. 【Docker 命令】 - search 命令

    docker search : 从Docker Hub查找镜像 语法 docker search [OPTIONS] TERM OPTIONS说明: --automated :只列出 automate ...

  5. (转)NEST.net Client For Elasticsearch简单应用

    由于最近的一个项目中的搜索部分要用到 Elasticsearch 来实现搜索功能,苦于英文差及该方面的系统性资料不好找,在实现时碰到了不少问题,现把整个处理过程的代码分享下,给同样摸索的人一些借鉴,同 ...

  6. VS2010中的sln,suo分别是什么含义

    我们通过双击.sln加载出我们的工程. Visual Studio.NET采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件.为解决方案资源管理器提供显示管理文件 ...

  7. Zookeeper实现分布式集群监控

    Zookeeepr实现分布式集群监控 Zookeeper中节点有两种:临时节点和永久节点 从类型上看节点又可以分为四种节点类型:PERSIST,PERSIST_SEQUENTIAL,EPHEMERAL ...

  8. CentOS 文件特殊权限SUID,SGID,SBIT

    1.SUID ,是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效). (1)SUID权限仅对二进制程序有效: (2)本权限仅在执行该 ...

  9. 【题解】Atcoder ARC#85 E-MUL

    ……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 ...

  10. BZOJ1568:[JSOI2008]Blue Mary开公司——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1568 李超线段树(不会的话去网上搜吧……). 完. #include<map> #in ...