使用emplace_back就地构造

emplace_back能就地通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好的避免内存的拷贝和移动,使得容器插入元素的性能得到进一步提升。在大多数情况下应该优先使用emplace_back来代替push_back
    所有的标准库容器(array除外,因为它长度不可改变,不能插入元素)都增加了类似的方法:emplace, emplace_hint, emplace_front, emplace_after, emplace_back. 
    如果需要使用emplace_xx 来就地构造,则需要提供类或者结构体的构造函数。

struct A{
int a;
int b;
A(int x, int y):a(x), b(y){};
};
int main(){
vector<A> v;
v.emplace_back(1,2); //就地构造,需要结构体或类提供构造函数
cout << v.size() << endl;
return 0;
}

使用unordered container无序容器

c++11增加了无序容器 unordered_map/unordered_multimap/unordered_set/unordered_multiset,这些容器中的元素不排序,使用哈希进行查找和存储,因此效率更高。 
    由于无序容器内部使用散列表,因此无序容器的key需要提供hash_value 函数,其他用法和map/set相同,对于自定义的key,需要提供hash函数和比较函数

struct Key{
std::string first;
std::string second;
};
struct KeyHash{
std::size_t operator()(const Key& k)const{
return std::hash<std::string>()(k.first)^(std::hash<std::string>()(k.second) << 1);
};
};
struct KeyEqual{
bool operator()(const Key& k1, const Key& k2){
return k1.first == k2.first && k1.second == k2.second;
}
};
int main(){
std::unordered_map<std::string, int> m1;
decltype(m1) m2 = {{"hello", 1}, {"world", 2}}; std::unordered_map<Key, std::string, KeyHash, KeyEqual> m6 = {
{{"john", "doe"}, "example"},
{{"mary, "sue"}, "another"}}; //自定义类型的key,需要提供hash函数和比较函数
return 0;
};
+

最新文章

  1. L2-011. 玩转二叉树
  2. SQLServer生成三位姓名及11位国内电话号码(生成测试数据用)
  3. Ubantu16.4的安装过程以及基本配置
  4. 20145218 《Java程序设计》第四周学习总结
  5. MyEclipse2015 编写js报 &#39;Calculating completion proposals..&#39; has encountered a problem.
  6. SqlDataAdapter的update方法
  7. Enterprise Library深入解析与灵活应用(2): 通过SqlDependency实现Cache和Database的同步
  8. RMAN综合学习之备份
  9. Java之webService知识
  10. Spring的 classpath 通配符加载配置文件
  11. 201521123018 《Java程序设计》第4周学习总结
  12. emos邮件系统的web密码修改方法
  13. C#Mvc批量删除
  14. eMMC基础技术4:eMMC command
  15. Sitecore开发 IP地理定位服务入门
  16. Intellij IDEA 设置启动JVM参数
  17. 源码 time sleep
  18. echarts 添加标线,设置颜色
  19. angularjs 路由机制
  20. ffmpeg 踩坑实录 近期使用总结(三)

热门文章

  1. FusionCharts JavaScript API - Events 全局事件处理
  2. uboot在nandflash存储时内存和NandFlash存储空间
  3. iOS边练边学--UIGestureRecognizer手势识别器简单介绍
  4. PHP 正则表达式 及常用汇总
  5. e558. 在Applet中多图片交互显示
  6. TF42064: The build number already exists for build definition error in TFS2010
  7. 一直误解的memset函数
  8. asp.net mvc中加入log4net记录错误日志
  9. js 动态设置 option 的selected 选项
  10. Linux /proc/loadavg(平均负载)