向量VS向量在C 11

前端之家收集整理的这篇文章主要介绍了向量VS向量在C 11前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们为什么要使用vector< char>而不是矢量< bool>? vector< char>的原因是什么?是比较快的?

解决方法

的std ::矢量< BOOL>是std :: vector< T>的专门化.这主要是为了提高空间效率(有争议).然而,它的行为与常规std :: vector< T>相似但不均等.这主要归因于std :: vector< bool>不是通常的C标准库意义上的容器,而是一个位数组. std :: vector< bool>之间的一些区别和常规的std :: vector是:

> std :: vector< bool> :: iterator不是随机访问迭代器.
> std :: vector< bool>不需要将其元素存储为连续数组.
> std :: vector< bool>暴露类std :: vector< bool> :: reference作为访问各个位的方法.特别是,此类的对象由operator [],std :: vector< bool> :: front,std :: vector< bool> ::返回值返回.
> std :: vector< bool>不使用std :: allocator_traits :: construct来构造位值.
> std :: vector< bool>不保证同一容器中的不同元素可以由不同的线程同时修改.
> std :: vector< bool>有一个不同的接口(即flip())

除了将std :: vector的概念含义打破为连续容器之外,这些差异还具有破坏用户代码的趋势,特别是当此代码是通用的(即模板代码)时.

为了澄清,请考虑以下示例:

template<class T> void foo(std::vector<T> &v) {
 T &frnt = v.front();
 ...
}

以上示例适用于每个T,除非T = bool.如前所述,这种失败的原因是v.front()的返回值是临时值(按值返回),因此无法绑定到引用.

为了避免这种破坏,许多程序员避免使用std :: vector< bool>并且更喜欢使用std :: vector< char>.由于引起的许多问题,许多人都说过使用std :: vector< bool>可以被视为过早的优化.为解决这个问题,许多杰出的C社区成员提出了建议.其中一个建议建议删除std :: vector< bool>在不同的名称下,它不会引用C标准库容器.

现在到时间性能问题,std :: vector< bool>的主要问题是它的各自的std :: algorithm算法没有针对它进行优化.因此,尽管您可以通过使用它来获得空间,但它的使用可能会导致非常显着的速度悲观.

参考书目

> vector: More Problems,Better Solutions,Herb Sutter

> On vector<bool>,Howard Hinnant
> std::vector<bool>

原文链接:https://www.f2er.com/c/117277.html

猜你在找的C&C++相关文章