SGI

bit_vector

类别: 容器 组件类型: 类型

描述

一个bit_vector本质上是一个vector<bool>: 它是一个 序列,具有与vector相同的接口。主要区别在于bit_vector针对空间效率进行了优化。一个vector始终需要至少一个字节的元素,但一个bit_vector只需要每元素一个位。

警告: 名称bit_vector将在 STL 的未来版本中删除。唯一的原因是bit_vector是一个单独的类,而不是vector<bool>的模板特化,是因为这需要模板的部分特化。在支持部分特化的编译器上,bit_vectorvector<bool>的特化。名称bit_vector是一个typedef. 这typedef在 C++ 标准中没有定义,仅为了向后兼容性而保留。

示例

bit_vector V(5);
V[0] = true;
V[1] = false;
V[2] = false;
V[3] = true;
V[4] = false;

for (bit_vector::iterator i = V.begin(); i < V.end(); ++i)
  cout << (*i ? '1' : '0');
cout << endl;

定义

定义在标准头文件 vector 中,以及非标准的向后兼容头文件 bvector.h 中。

模板参数

无。Bit_vector不是一个类模板。

模型

随机访问容器, 尾部插入序列.

类型要求

无。

公共基类

无。

成员

成员 定义位置 描述
value_type 容器 存储在 bit_vector 中的对象类型bool
reference bit_vector 一个代理类,充当对单个位的引用。有关详细信息,请参见下文。
const_reference 容器 value_type的常量引用。在bit_vector中,它简单地定义为bool.
size_type 容器 一个无符号整型。
difference_type 容器 一个有符号整型。
iterator 容器 用于遍历bit_vector.
const_iterator 容器 用于遍历bit_vector.
reverse_iterator 可逆容器 用于反向遍历bit_vector.
const_reverse_iterator 可逆容器 用于反向遍历bit_vector.
iterator begin() 容器 返回一个iterator指向bit_vector.
iterator end() 容器 返回一个iterator指向bit_vector.
const_iterator begin() const 容器 返回一个const_iterator指向bit_vector.
const_iterator end() const 容器 返回一个const_iterator指向bit_vector.
reverse_iterator rbegin() 可逆容器 返回一个reverse_iterator指向反向 bit_vector 的开头。
reverse_iterator rend() 可逆容器 返回一个reverse_iterator指向反向 bit_vector 的结尾。
const_reverse_iterator rbegin() const 可逆容器 返回一个const_reverse_iterator指向反向 bit_vector 的开头。
const_reverse_iterator rend() const 可逆容器 返回一个const_reverse_iterator指向反向 bit_vector 的结尾。
size_type size() const 容器 返回bit_vector.
size_type max_size() const 容器 返回bit_vector.
size_type capacity() const bit_vector 见下文。
bool empty() const 容器 true如果bit_vector的大小为0.
reference operator[](size_type n) 随机访问容器 返回n个元素。
const_reference operator[](size_type n) const 随机访问容器 返回n个元素。
bit_vector() 容器 创建一个空的 bit_vector。
bit_vector(size_type n) 序列 创建一个包含n个元素的 bit_vector。
bit_vector(size_type n, bool t) 序列 创建一个包含nt.
bit_vector(const bit_vector&) 容器 复制构造函数。
template <class InputIterator>
bit_vector(InputIterator, InputIterator)
[1]
序列 创建一个包含一个范围副本的 bit_vector。
~bit_vector() 容器 析构函数。
bit_vector& operator=(const bit_vector&) 容器 赋值运算符
void reserve(size_t) bit_vector 见下文。
reference front() 序列 返回第一个元素。
const_reference front() const 序列 返回第一个元素。
reference back() 尾部插入序列 返回最后一个元素。
const_reference back() const 尾部插入序列 返回最后一个元素。
void push_back(const T&) 尾部插入序列 在末尾插入一个新元素。
void pop_back() 尾部插入序列 移除最后一个元素。
void swap(bit_vector&) 容器 交换两个 bit_vector 的内容。
void swap(bit_vector::reference x,
          bit_vector::reference y)
bit_vector 见下文。
iterator insert(iterator pos, bool x) 序列 x之前插入pos.
template <class InputIterator>
void insert(iterator pos,
            InputIterator f, InputIterator l)
[1]
序列 插入范围[f, l)之前插入pos.
void insert(iterator pos, 
            size_type n, bool x)
序列 nx之前插入pos.
void erase(iterator pos) 序列 删除位置处的元素pos.
void erase(iterator first, iterator last) 序列 删除范围[first, last)
void clear() 序列 删除所有元素。
bool operator==(const bit_vector&, 
                const bit_vector&)
前向容器 测试两个 bit_vector 是否相等。这是一个全局函数,而不是成员函数。
bool operator<(const bit_vector&, 
               const bit_vector&)
前向容器 词典顺序比较。这是一个全局函数,而不是成员函数。

新成员

这些成员在 随机访问容器尾部插入序列 要求中没有定义,而是特定于vector.
成员 描述
reference 一个代理类,充当对单个位的引用;它存在的原因是为了允许像V[0] = true这样的表达式。(像这样的代理类是必要的,因为 C++ 内存模型不包含小于一个字节的对象的独立寻址。)reference的公共成员函数是operator bool() const, reference& operator=(bool)以及void flip(). 也就是说,reference就像一个普通的引用:你可以将一个reference转换为bool,通过一个bool赋值一个reference,或翻转一个reference引用的位。
size_type capacity() const 已分配内存的位数。capacity()始终大于或等于size(). [2] [3]
void reserve(size_type n) 如果n小于或等于capacity(),则此调用没有任何作用。否则,它是一个请求分配更多内存。如果请求成功,则capacity()将大于或等于n;否则,capacity()将保持不变。无论哪种情况,size()都将保持不变。 [2] [4]
void swap(bit_vector::reference x,
          bit_vector::reference y)
交换由xy引用的位。swap接受类型为T&以及bit_vector::reference是一个类,而不是内置的 C++ 引用。

注释

[1] 此成员函数依赖于成员模板函数,目前(1998 年初)并非所有编译器都支持。如果你的编译器支持成员模板,你可以使用任何类型的 输入迭代器 调用此函数。但是,如果你的编译器尚不支持成员模板,则参数必须是类型为const bool*或类型为bit_vector::const_iterator.

[2] 如果插入到 bit_vector 中的位数超过capacity() - size(),内存将自动重新分配。重新分配不会改变size(),也不会改变 bit_vector 中任何位的的值。但是,它会增加capacity(),并且会使 [5] 指向 bit_vector 中的任何迭代器无效。

[3] 当需要增加capacity(), bit_vector通常会将其增加两倍。至关重要的是,增长量与当前capacity()成正比,而不是一个固定的常量:在前一种情况下,将一系列位插入 bit_vector 是一个线性时间操作,而在后一种情况下,它是二次时间操作。

[4] reserve()用于手动地导致重新分配。使用reserve()的主要原因是效率:如果你知道你的bit_vector最终必须增长到的容量,那么一次性分配所有内存可能比依赖于自动重新分配方案更高效。使用reserve()的另一个原因是控制迭代器的失效。 [5]

[5] 当其内存重新分配时,bit_vector的迭代器会失效。此外,在 bit_vector 的中间插入或删除位会使指向插入或删除点后的位的任何迭代器失效。因此,如果你使用reserve()预分配 bit_vector 将使用的所有存储空间,并且所有插入和删除都位于 bit_vector 的末尾,则可以防止 bit_vector 的迭代器失效。

另请参见

vector
[Silicon Surf] [STL Home]
Copyright © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息