c++11——改进容器性能
2024-09-22 07:43:44
使用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;
};
+
最新文章
- L2-011. 玩转二叉树
- SQLServer生成三位姓名及11位国内电话号码(生成测试数据用)
- Ubantu16.4的安装过程以及基本配置
- 20145218 《Java程序设计》第四周学习总结
- MyEclipse2015 编写js报 &#39;Calculating completion proposals..&#39; has encountered a problem.
- SqlDataAdapter的update方法
- Enterprise Library深入解析与灵活应用(2): 通过SqlDependency实现Cache和Database的同步
- RMAN综合学习之备份
- Java之webService知识
- Spring的 classpath 通配符加载配置文件
- 201521123018 《Java程序设计》第4周学习总结
- emos邮件系统的web密码修改方法
- C#Mvc批量删除
- eMMC基础技术4:eMMC command
- Sitecore开发 IP地理定位服务入门
- Intellij IDEA 设置启动JVM参数
- 源码 time sleep
- echarts 添加标线,设置颜色
- angularjs 路由机制
- ffmpeg 踩坑实录 近期使用总结(三)
热门文章
- FusionCharts JavaScript API - Events 全局事件处理
- uboot在nandflash存储时内存和NandFlash存储空间
- iOS边练边学--UIGestureRecognizer手势识别器简单介绍
- PHP 正则表达式 及常用汇总
- e558. 在Applet中多图片交互显示
- TF42064: The build number already exists for build definition error in TFS2010
- 一直误解的memset函数
- asp.net mvc中加入log4net记录错误日志
- js 动态设置 option 的selected 选项
- Linux /proc/loadavg(平均负载)