C 基礎 bitset與string的相互轉化

2021-07-06 10:31:14 字數 1425 閱讀 9661

bitset類模板提供了非常直接的介面進行與string型別資料的轉換。然而一些需要注意的細節又是非常繁瑣。具體如何繁瑣,且看下文分解。

在閱讀本文之前,你需要知道bitset模板類實現的基礎,即非型別模板引數技術。

bitset<>類模板的非型別引數的例項化,構造時可以接受乙個string型別,且bitset<>::to_string成員函式可以實現向string型的轉換。但需注意的一點是,string為引數的構造以及to_string都是成員模板,因為庫類std::basic_string本身也是乙個模板,一般的string類形式,std::stringbasic_string的別稱:

typedef basic_string, allocator >

string;

因為string型別引數的構造以及to_string都是以成員模板的形式定義的,所以(新的c++標準放寬了這些條件,但為了嚴格,以及閱讀稍早期一點**的方便,還是整理出來):

// 推擠寫法

std::bitset

<6>(std::string("110101"));

// 而不是

std::bitset

<6>("110101");

第二種版本可能會發生編譯錯誤在一些老式的編譯器上,因為編譯器不知道如何進行例項化。同樣地,因為成員模板函式的特性,不可以直接這樣寫:

string s =b.to_string();
你必須寫成這樣乙個醜八怪:

string s = 

b.template to_string,

allocator >();

b.template的存在是為了告訴編譯器,其後的第乙個<不是小於號,而是模板引數列表的格式。

template

bitset

from_string(const

string& s)

這時客戶端程式:

bitset

<6> b = from_string<6>("110101");

這裡隱式地存在乙個const string& s = "110101";的轉換。

template

std::string to_string(const

std::bitset

& b)

StringBuilder類與String類的區別

url string 物件是不可改變的。每次使用 system.string 類中的方法之一或進行運算時 如賦值 拼接等 時,都要在記憶體中建立乙個新的字串物件,這就需要為該新物件分配新的空間。而 stringbuilder 則不會。在需要對字串執行重複修改的情況下,與建立新的 string 物件相...

位運算與bitset

將兩個數轉化為二進位制後,對應的位置上相同即取,通常取1,所以 通常情況下可以用來列舉子集 設x為表示集合的整數,那麼這個整數有如下性質 x的子集整數y在數值上不會比x大。因為x的子集y只是保留了x某些位置上的1,所以y總可以加上乙個非負的整數z等於x,相當於把沒選的1補上。根據這個性質可知,可以通...

bitset位向量用法 c

首先要匯入bitset庫 include bitset初始化 舉些例子 bitset 16 foo 16位全為0輸出 0000000000000000 bitset 16 foo 5 共16位,值為5輸出 0000000000000101 int h 1,m 1 bitset 10 foo h 6 ...