c++ 11标准模板(STL) std::vector<bool> (二)

定义于头文件 <vector>

template<class Allocator>
class vector<bool, Allocator>;

 std::vector<bool> 是 std::vector 对类型 bool 为空间提效的特化。

std::vector<bool> 中对空间提效的行为(以及它是否有优化)是实现定义的。一种潜在优化涉及到 vector 的元素联合,使得每个元素占用一个单独的位,而非 sizeof(bool) 字节。

std::vector<bool> 表现类似 std::vector ,但为节省空间,它:

  • 不必作为连续数组存储元素(故 &v[0] + n != &v[n] )
  • 暴露类 std::vector<bool>::reference 为访问单个位的方法。尤其是,此类型的类为 operator[] 以值返回。
  • 不使用 std::allocator_traits::construct 构造位值。
  • 不保证同一容器中的不同元素能由不同线程同时修改。

表示到单个 bool 的引用的代理类

std::vector<bool>::reference

class reference;

 std::vector<bool> 特化定义 std::vector<bool>::reference 为可公开访问的嵌套类。 std::vector<bool>::reference 代理访问 std::vector<bool> 中单个位的行为。

std::vector<bool>::reference 的基础使用是提供能从 operator[] 返回的左值。

任何通过 std::vector<bool>::reference 发生的对 vector 的读或写,会潜在地读或写整个底层的 vector 。

成员函数

(构造函数)

构造引用,仅为 std::vector<bool> 自身所能访问
(公开成员函数)

(析构函数)

销毁引用
(公开成员函数)

operator=

赋 bool 给被引用位
(公开成员函数)

operator bool

返回被引用位
(公开成员函数)

flip

翻转被引用位
(公开成员函数)

std::vector<bool>::reference::~reference

~reference();

销毁引用。

std::vector<bool>::reference::operator=

reference& operator=( bool x );
reference& operator=( const reference& x );

(C++11 前)

reference& operator=( bool x ) noexcept;
reference& operator=( const reference& x ) noexcept;

(C++11 起)

赋值给被引用位。

参数

x - 要赋值的值

返回值

*this

std::vector<bool>::reference::operator bool

operator bool() const;

(C++11 前)

operator bool() const noexcept;

(C++11 起)

返回被引用位。

参数

(无)

返回值

被引用位。

std::vector<bool>::reference::flip

void flip();

(C++11 前)

void flip() noexcept;

(C++11 起)

反转被引用位。

参数

(无)

vector<bool> 特定修改器

翻转所有位

std::vector<bool,Allocator>::flip

void flip();

 翻转 vector 中的每个 bool (以其反对值替换)。

参数

(无)

返回值

(无)

交换二个 std::vector<bool>::reference

std::vector<bool,Allocator>::swap

static void swap(reference x, reference y);

 交换 xy 的内容。

参数

x - 要与 y 交换的 std::vector<bool>::reference 值
y - 要与 x 交换的 std::vector<bool>::reference 值

返回值

(无)

复杂度

常数。

帮助类

std::vector<bool> 的哈希支持

std::hash (std::vector<bool>)

template <class Allocator> struct hash<vector<bool, Allocator>>;

(C++11 起)

 std::hash 对 std::vector<bool> 的模板特化允许用户获得 std::vector<bool> 类型对象的哈希。

调用示例

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <time.h>
#include <vector>

int main()
{
    std::cout << std::boolalpha;

    std::mt19937 g{std::random_device{}()};
    srand((unsigned)time(NULL));

    auto generate = []()
    {
        bool b = std::rand() % 2 == 0;
        return b;
    };

    std::vector<bool> vecor_bool_1(6);
    std::generate(vecor_bool_1.begin(), vecor_bool_1.end(), generate);
    std::cout << "vecor_bool_1:  ";
    std::copy(vecor_bool_1.begin(), vecor_bool_1.end(),
              std::ostream_iterator<bool>(std::cout, "   "));
    std::cout << std::endl;
    std::cout << std::endl;

    //翻转 vector 中的每个 bool (以其反对值替换)。
    std::cout << "void flip():  " << std::endl;
    vecor_bool_1.flip();
    std::cout << "vecor_bool_1:  ";
    std::copy(vecor_bool_1.begin(), vecor_bool_1.end(),
              std::ostream_iterator<bool>(std::cout, "   "));
    std::cout << std::endl;
    std::cout << std::endl;

    //交换 x 与 y 的内容。
    std::cout << "static void swap(reference x, reference y):  " << std::endl;
    vecor_bool_1.swap(vecor_bool_1[0], vecor_bool_1[1]);
    std::cout << "vecor_bool_1:  ";
    std::copy(vecor_bool_1.begin(), vecor_bool_1.end(),
              std::ostream_iterator<bool>(std::cout, "   "));
    std::cout << std::endl;
    std::cout << std::endl;

    return 0;
}

 输出

猜你喜欢

转载自blog.csdn.net/qq_40788199/article/details/130545226