swich case字串妙用

2021-10-16 05:41:41 字數 1286 閱讀 3100

const char* str = "first";

switch(str)

但是在c++中,是不能用字串來作為case的標籤的;於是,很疑惑,我們只能用其他的辦法來實現這樣的需求。

但幸運的是,c++11引入了constexpr和自定義文字常量,將這兩個新特性結合,我們實現出看上去像上面這樣的**。

基本思路為:

1、定義乙個hash函式,計算出字串的hash值,將字串轉換為1個整數;

typedef std::uint64_t hash_t;

constexpr hash_t prime = 0x100000001b3ull;

constexpr hash_t basis = 0xcbf29ce484222325ull;

hash_t hash_(char const* str);

while(*str)

return ret;

}2、利用c++11自定義文字常量的語法,定義乙個constexpr函式,switch的case標籤處呼叫這個constexpr函式。如下

constexpr hash_t hash_compile_time(char const* str, hash_t last_value = basis)

這個函式只有短短的一行,利用遞迴得到了與上面hash_函式得到的同樣值,由於用constexpr宣告了函式,因此編譯器可以在編譯期得出乙個字串的hash值,而這正是關鍵,既然是編譯器就可以得到的整型常量,自然可以放到switch的case標籤處了。

於是我們可以寫出這樣的swich語句:

void ******_switch2(char const* str)

}這個實現中,hash_compile_time("first")是編譯器計算出來的乙個常量,因此可以用作case標籤;而且如果出現了hash值衝突,編譯器回給出錯誤提示。

3、上面的語法還不夠漂亮,利用自定義文字常量,過載乙個operator如下:

constexpr unsigned long long operator "" _hash(char const* p, size_t)

現在我們可以寫這樣的文字常量,用「_hash」作為自定義文字常量的字尾,編譯器看到這個字尾結尾的文字常量,就會去呼叫我們過載的operator,得到和呼叫hash_compile_time是一樣的值,但看起來舒服多了:

"first"_hash

現在,我們寫出的switch語句就好看多了。

void ******_switch(char const* str)

}

ORACLE in 字串,字串,字串

因為傳進來的引數是 字串,字串,字串,要實現in 字串,字串,字串 select from htl price p where p.hotel id 30073328 and p.able sale date between to date 2009 03 27 yyyy mm dd and to ...

stringstream字串流的妙用

現在有乙個陣列,其值為從1到10000的連續增長的數字。出於某次偶然操作,導致這個陣列中丟失了某三個元素,同時順序被打亂,現在需要你用最快的方法找出丟失的這三個元素,並且將這三個元素根據從小到大重新拼接為乙個新數字,計算其除以7的餘數。例 丟失的元素為336,10,8435,得到的新數字為10336...

字串,字串陣列,字串指標!!

字串 字元陣列實際上是一系列字元的集合,也就是 字串 string 字串陣列 在c語言中,沒有專門的字串變數,沒有string型別,通常就用乙個字元陣列來存放乙個字串。c語言規定,可以將字串直接賦值給字元陣列 在c語言中,字串總是以 0 作為串的結束符。上面的兩個字串,編譯器已經在末尾自動新增了 0...