C 實現高效能轉換大小寫演算法示例

2022-10-04 00:24:20 字數 1699 閱讀 4254

簡述

最近工作中遇到乙個需求,是需要將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 然後把這個字串內的每乙個字元進行大小寫變換,即將大寫字母變成小寫,小寫字母變成大寫,然後把這個新的字串輸出。輸入格式 輸入乙個字串,而且這個字串當中只包含英文本母,不包含其他型別的字元,也沒有空格。輸出格式 輸出經過轉換後的字串。輸入輸出樣例 樣...