zoukankan      html  css  js  c++  java
  • C++STL位标志、智能指针与异常处理

    参考《21天学通C++》第25章节,对STL位标志进行介绍。就是当需要不是像char int long 等整个字节数的数据表示形式,而是使用二进制位表示的时候,通常使用这里讲到的位标志。从C++标准模板库的角度讲,实现了两种形式的位标志:bitset类与vector<bool> 模板来较为方便的实现各种各样的位存储与位操作。

    一、使用STL位标志

    位是存储设置与标志的高效方法。标准模板库提供了可帮助组织与操作位信息的类。

    1. bitset类

    std::bitset不是STL容器类,因为它不能调整长度,这是一个实用类,针对处理长度在编译阶段已知的位序列进行了优化。需包含#include <bitset>。

    2. 实例化bitset

    bitset <4> fourBits;

    bitset <5> fiveBits ("10101");

    bitset <8> eightBitsCopy(eightbits);

    可以利用整数来初始化位。

    但是得记住:bitset不像vector那样,它的位数在编译阶段指定的,而不是动态调整的,因此指定后就不能插入更多的位。

    3. bitset类操作运算符与成员函数

    bitset提供了一些很有用的运算符,比如:

    <<  将位序列的文本插入到输入流中;

    >>  将一个字符插入到bitset对象中;

    &   执行按位与;

    |   执行按位或;

    ^   执行按位异或;

    ~   执行按位取反;

    >>= 执行按位右移操作;

    <<= 执行按位左移操作;

    运算符[N] 提供类似数组下标的引用访问方式;

    位是可以存储两种状态,对bitset的内容操作,可使用如下的成员函数对bitset中的一位或所有位进行操作:

    set  将序列中的所有位进行置位操作;

    set(N,val=1) 将N+1位设置为val指定的值,默认为1;

    reset  将序列中的所有位进行复位操作;

    reset(N) 将N+1位进行复位操作

    flip  将位序列中的所有位取反;

    size  返回序列中的位数;

    count  返回序列中值为1的位数;

    4. vector <bool>

    STL bitset的缺点之一就是不能动态调整长度;为了克服这种缺点,STL向程序员提供了vector <bool>。

    vector <bool>是对vector的部分具体化,用于存储布尔数据,可用于动态调整长度,因此程序员无需在编译阶段知道要存储的布尔标志数。

    除了对于vector<bool>提供了函数flip,用于将序列中的布尔值取反之外,其他操作与vector大部分相同。不再赘述。

    5. 总结

    bitset是处理位序列和位标志最有效的工具;另外通过vector<bool>能提供动态bool。

    ************************

    2015-8-9


  • 相关阅读:
    uva 147 Dollars
    hdu 2069 Coin Change(完全背包)
    hdu 1708 Fibonacci String
    hdu 1568 Fibonacci
    hdu 1316 How Many Fibs?
    poj 1958 Strange Towers of Hanoi
    poj 3601Tower of Hanoi
    poj 3572 Hanoi Tower
    poj 1920 Towers of Hanoi
    筛选法——素数打表
  • 原文地址:https://www.cnblogs.com/huty/p/8519258.html
Copyright © 2011-2022 走看看