C++(11)在时空性能方面的改进

本文详细介绍了C++11在时空性能方面的改进,包括新增的高效容器如array、forward_list和unordered containers,常量表达式constexpr、静态断言static_assert,以及move语义和右值引用。array是一个大小固定的容器,不预留多余空间,适用于替代内建数组。forward_list是单向链表实现的列表,适合快速插入和删除。unordered containers(如unordered_map)基于哈希表,提供O(1)查找效率。constexpr允许编译时计算,提高程序效率。static_assert提供编译时断言检查。move语义和右值引用减少拷贝,提升效率。最后,介绍了原地安置操作emplace,直接在容器中构造对象,进一步提高性能。
摘要由CSDN通过智能技术生成

主要包括以下方面:

1.新增的高效容器:array、forward_list以及unordered containers;

2.以及常量表达式、静态断言和move语义;

大小固定容器 array

std::array是一个支持随机访问且大小(size)固定的容器,它是c++11中新增的容器。它有如下特点:

不预留多余空间,只分配必须空间(译注:size() == capacity())。

可以使用初始化表(initializer list)的方式进行初始化。

保存了自己的size信息。

不支持隐式指针类型转换。

可以认为它是一个很不错的内建数组类型。示例:

array<int,6> a = { 1, 2, 3 };

a[3]=4;

int x = a[5];    // array的默认数据元素为0,所以x的值变成0

int* p1 = a; // 错误: std::array不能隐式地转换为指针

int* p2 = a.data(); // 正确,data()得到指向第一个元素的指针

可以认为array是一个紧缩版的vector,它比vector高效(没有自动空间分配),但缺少了push_back这样的神器,使得它的使用场景一般是用来替换c++内建的数组类型,而不是vector;

前向列表 forward_list

c++11新增的容器:前向列表 forward_list

前向列表是一个能够在任意位置快速插入和删除的容器(列表都这特性,前向列表当然也具有这特性),但不支持快速随机存取。如果想一起交流的可以加这个群:941636044 ,有什么问题可以群里面交流,群里面也有许多方便学习C语言C++编程的资料可以给你利用。

它是用单向链表实现的,相比较于它的C实现而言没有什么额外开销。相较于std::list而言,此容器耗费的空间更少,因为它是单向的,不是双向的。

std::forward_list<int> mylist (3,5);   // 3 ints with value 5

for (int& x : mylist ) std::cout << " " << x;

哈希表[无序容器] unordered containers

hash容器在很多之前的编译器中就包含进来了;比如gcc 较早的版本中,它存在于tr1命名空间中;

以unordered_map为例,unordered_map基于散列表实现,元素之间无序存储;

而map基于红黑树实现,元素之间有序(通过operator< 进行比较);

hash版本的查找时间复杂度为O(1),在数据量很大时,比红黑树的版本效率高很多;

对比在C++11中和之前使用上的区别:

// c++0x中:

#include <tr1/unordered_map>

std::tr1:: unordered_map< char,int >  map1;

map1.insert(std::pair<char,int>('

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值