簡述
最近工作中遇到乙個需求,是需要將url中的 query 引數的key全部轉換為小寫或者大寫,鍵值對的數量有點多,但全部都是英文本母,無需考慮非字母的情況。
實現比較快的做法是使用stl或c標準庫中的轉換介面,如下:
#include
#include
#include
// 字串中的大寫字元轉小寫
std::string strtolower(std::string s)
// 字串中的小寫字元轉大寫
std::string strtoupper(std::string s)
這個方法雖然很好,但是效率不是很高。
分析了一下ascii碼的碼值,發現大小寫字母的ascii碼之間是有規律的。
原理英文本母的ascii碼值表示如下
對比一下其二進位制形式
從對比的結果可以看出,大寫字母與小寫字母的差別僅是乙個位元位的不同。
因為它們的這個規律,可以寫出下面的轉換函式(如果輸入不是字母,轉出的結果會有錯誤)
可以檢視數字 0-9 的ascii碼值,可以看出它們的第6位都是0,所以轉為小寫的演算法不會影響數字的值。
轉小寫演算法中受到影響的,只有ascii碼二進位制表示中第六位為0的部分。其中非字母部分如下表
#include
#include
#include
// 更優化
std::string strtoupper(std::string s)
size_t len = s.size() + 1;
size_t alignlen = len + 8 - (len % 8);
s.resize(alignlen);
size_t ec = alignlen / 8;
uint64_t* p8 = (uint64_t*)s.data();
for(size_t i=0;iwww.cppcns.come_t ec = len /8;
unqfvfoiint64_t* p8 = (uint64_t*)s.data();
for(size_t i=0;i
效能測試
測試**如下:
int main()
-- 編譯時候請勿優化,否則可能被優化掉! --
測試結果如下:
使用stl演算法
stl演算法部分主要由標頭檔案,,程式設計客棧;functional>組成。要使用 stl中的演算法函式必須包含標頭檔案,對於數值演算法須包含,中則定義了一些模板類,用來宣告函式物件。
stl中演算法大致分為四類:
1、非可變序列演算法:指不直接修改其所操作的容器內容的演算法。
2、可變序列演算法:指可以修改它們所操作的容器內容的演算法。
3、排序演算法:包括對序程式設計客棧列進行排序和合併的演算法、搜尋演算法以及有序序列上的集合操作。
4、數值演算法:對容器內容進行數值計算。
結果如下
time ./teststl
./teststl 7.88s user 0.03s system 100% cpu 7.904 total
自寫**測試結果如下
time ./test
./test 0.93s user 0.00s system 99% cpu 0.928 total
可以看到,其效能有差異。(應用場景有限)
總結本文標題: c++實現高效能轉換大小寫演算法示例
本文位址:
C 大小寫轉換
time limit 1000 ms memory limit 65536 kib submit statistic problem description x現在要學習英文以及各種稀奇古怪的字元的了。現在他想把一串字元中的小寫字母變成大寫字元,大寫字母變成小寫字母,其他的保持不變。input 輸入...
C 大小寫轉換
如果使用string類,可以使用 include裡的如下方法進行大小寫轉換 leetcode不支援這個函式 transform str.begin str.end str.begin tolower 記得 tolower前面有 而且是 tolower,不是 tolower 如果用char陣列,也可以...
演算法訓練 大小寫轉換
問題描述 編寫乙個程式,輸入乙個字串 長度不超過20 然後把這個字串內的每乙個字元進行大小寫變換,即將大寫字母變成小寫,小寫字母變成大寫,然後把這個新的字串輸出。輸入格式 輸入乙個字串,而且這個字串當中只包含英文本母,不包含其他型別的字元,也沒有空格。輸出格式 輸出經過轉換後的字串。輸入輸出樣例 樣...