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


  • 相关阅读:
    我的20130220日 在北京 do{ Web Develop } while(!die)
    关于NVelocity模板引擎初学总结
    C# 23种设计模式汇总
    基于模型的设备故障检测
    图像去噪之光斑去除
    虹膜识别
    封闭曲线拟合
    基于故障树的系统可靠性分析
    图像识别之棋子识别
    时间序列的模式距离
  • 原文地址:https://www.cnblogs.com/huty/p/8519259.html
Copyright © 2011-2022 走看看