BitSet构造函数的两种特例

C++11之后,bitset的构造函数新加了两种形式:

bitset<bits>::bitset (const string& str,
                              string::size_type str_idx, string::size_type str_num,
                              string::charT zero)
bitset<bits>::bitset (const string& str,
                              string::size_type str_idx, string::size_type str_num,
                              string::charT zero, string::charT one)

在vs2015中作如下实现:

template<class _Elem,
        class _Tr,
        class _Alloc>
        explicit bitset(const basic_string<_Elem, _Tr, _Alloc>& _Str,
            _BITSET_SIZE_TYPE _Pos = 0,
            _BITSET_SIZE_TYPE _Count = basic_string<_Elem, _Tr, _Alloc>::npos,
            _Elem _E0 = (_Elem)‘0‘,
            _Elem _E1 = (_Elem)‘1‘)
        {    // construct from [_Pos, _Pos + _Count) elements in string
        _Construct(_Str, _Pos, _Count, _E0, _E1);
        }

其_Construct如下:

template<class _Elem,
        class _Tr,
        class _Alloc>
        void _Construct(
            const basic_string<_Elem, _Tr, _Alloc>& _Str,
            _BITSET_SIZE_TYPE _Pos,
            _BITSET_SIZE_TYPE _Count,
            _Elem _E0,
            _Elem _E1)
        {    // initialize from [_Pos, _Pos + _Count) elements in string
        if (_Str.size() < _Pos)
            _Xran();    // _Pos off end
        if (_Str.size() - _Pos < _Count)
            _Count = _Str.size() - _Pos;    // trim _Count to size

        typename basic_string<_Elem, _Tr, _Alloc>::size_type _Num;
        for (_Num = 0; _Num < _Count; ++_Num)
            if (!_Tr::eq(_Str[_Pos + _Num], _E0)
                && !_Tr::eq(_Str[_Pos + _Num], _E1))
                _Xinv();

        if (_Bits < _Count)
            _Count = _Bits;    // trim _Count to length of bitset
        _Tidy();

        for (_Pos += _Count, _Num = 0; _Num < _Count; ++_Num)
            if (_Tr::eq(_Str[--_Pos], _E1))
                set(_Num);
        }

在Nicolai M Josuttis的标准库参考书中有这么一句话:Throw invalid_argument if one of the characters is neither ’0’/zero nor ’1’/one.但在vs2015中却可以以’1’/zero和’0’/one的组合作为参数。程序会用0和1分别代替1和0应填充的位置,不足位仍用0填充。不会抛出异常。同时我没在标准文档中找到相关说明。只在草案n4567中找到这么一句:

The function then throws invalid_argument if any of the rlen characters in str beginning at position
pos is other than zero or one. The function uses traits::eq() to compare the character values.

显然这并没太大关系。

时间: 2024-10-12 15:50:42

BitSet构造函数的两种特例的相关文章

两种用于派生的Singleton模式(以TextureMgr为例)

Singleton,顾名思义,从字面上来理解就是单例模式,这是C++程序中 常用到的一种设计模式,特别是像文件管理器,纹理管理器这种整个软件 中只需要唯一的实例来管理所有资源时,这种模式的价值便得以体现. 下面来介绍两种用于派生管理的Singleton模式: 其中,第一种是Gof版本的Singleton, 其代码如下: //[Singleton_Gof.h] #pragma once template<typename T> class Singleton_Gof { protected: s

【转载】C++创建对象的两种方法

原文:http://blog.sina.com.cn/s/blog_586b6c050100dhjg.html 在C++里,有两种方法创建对象: 方法一: ClassName object(param); 这样就声明了一个ClassName类型的object对象,C++会为它分配足够的存放对象所有成员的存储空间. 注意:为节省存储空间,C++创建对象时仅分配用于保存数据成员的空间,而类中定义的成员函数则被分配到存储空间中的一个公用区域,由该类的所有对象共享. 例如,我定义了一个这样的类: cla

慎用缺省构造函数的一种场景

本文通过示例来谈谈慎用缺省构造函数的一种设计场景.--以JAVA为例展开讨论. 为了便于讨论,我们假定需要建模一个Student,包括姓名和出生地两个属性.我们看到不少下面的代码: public class Student { private String name = null; private String birthPlace = null; public Student() { } public void setName(String name) { this.name = name;

java String 两种不同的赋值 比较

原文http://blog.163.com/[email protected]/blog/static/1271436362012101214031911/ 在此感谢博主写出这么优秀的文章. 首先明确一点,String是一个类.下面我们主要讨论两个问题  a) String类的对象的两种赋值方式  b) 为什么String类的对象可以直接赋值  a) 1 类似普通对象,通过new创建字符串对象.String str = new String("Hello"); 内存图如下图所示,系统会

JavaScript中两种类型的全局对象/函数

这里所说的JavaScript指浏览器环境中的包括宿主环境在内的. 第一种是ECMAScript Global Object,第二种是宿主环境(Host)下的全局对象/函数. 一.核心JavaScript内置对象,即ECMAScript实现提供的不依赖于宿主环境的对象 这些对象在程序执行之前就已经(实例化)存在了.ECMAScript称为The Global Object,分为以下几种 1, 值属性的全局对象(Value Properties of the Global Object).有NaN

对象创建的两种方法

对象: 什么是对象呢?现实中的男女朋友?某一个事物的指代?那么在JS的函数中对象就是一组无序属性的集合. 对象的作用就是可以帮助我们封装一些数据,方便我们在程序中的传输或是控制,同时对象也可以帮我们描述一些事物:在JS中对象是有属性和方法组成的. 那么对象要怎么创建呢? 1.首先我们可以通过构造函数的方式创建自定义对象: 例: var student = new Object();  //创建了一个学生的空对象    // 属性(特征,姓名,性别,年龄,手机号,家庭)和方法(打招呼,游泳,打球)

两种项目中可用的单例模式

一个正常的饿汉单例模式 //CEO,饿汉单例模式 public class CEO extends Staff{ private static final CEO mCeo = new CEO(); //构造函数私有 private CEO(){ } //公有的静态函数,对外暴露获取单例对象的接口 public static CEO getCeo(){ return mCeo; } @Override public void work(){ //管理VP } } 这种最简单的单例模式存在资源消耗

Web API之认证(Authentication)两种实现方式【二】(十三)

前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到底就是安全问题,在Web API中有多种方式来实现安全,[accepted]方式来处理基于IIS的安全(通过上节提到的WindowsIdentity依赖于HttpContext和IIS认证)或者在Web API里通过使用Web API中的消息处理机制,但是如果我们想应用程序运行在IIS之外此时Win

WCF-异步调用和两种客户端形式

当发布一个服务端之后,客户端可以通过服务端的元数据,用VS2010添加服务引用的方式生成对应的代码.并且可以选择生成相应的异步操作. WCF实现代码,Add操作延时5秒后再返回结果. [ServiceContract] public interface ICalculator { [OperationContract] int Add(int x, int y); } [ServiceBehavior] public class Cal : ICalculator { public int Ad