[C++] 使用 transform 函式將字串中的字元都轉成小寫

C++的字串函庫沒有提供將字元轉成大寫,或是小寫的功能,所以只能呼叫 algorithm 函式庫中的 transform 函式來完成。底下是個示範。

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string s = "How are You";
/*transform 是定義在 algorithm 中的,記得要 #include<algorithm>
*transform 會掃描 s 的每個字元,並針對每個字元呼叫 tolower 函式。
*tolower 函式會把每個字元轉成小寫。
*/
transform(s.begin(), s.end(), s.begin(), tolower);
cout << s << endl;
}
view raw string_tolower hosted with ❤ by GitHub


transform 函式有許多種版本,這兒介紹最簡單的一種。
transform 會掃描字串,掃描的範圍由第 1 及第 2 個參數來決定。在這個例子中,transform 會由字串的開頭(s.begin()),一直掃描到字串的結尾(s.end())。

在掃描時,transform 每掃到一個字元,就會呼叫 tolower 函式(即第 4 個參數)。tolower 函式會讀入對應的字元,轉換為小寫,再回傳回去。

至於第 3 個參數的作用,則決定了 transform 函式「輸出」的位置。在這個例子中,transform 函式會把轉成小寫的字元,由 s 的開頭再次回寫回去。

第 3 個參數的作用比較不好解釋,我們再用底下的例子加以說明。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int doubleInt(int v)
{
return v * 2;
}
int main()
{
vector<int> buf;
buf.push_back(1);
buf.push_back(18);
buf.push_back(3);
buf.push_back(33);
buf.push_back(29);
//buf 的內容為 [1, 18, 3, 33, 29]
//buf1 的大小為 5
vector<int> buf1(5);
transform(buf.begin(), buf.end(), buf1.begin(), doubleInt);
for (int i = 0; i < buf.size(); i++)
{
cout << buf1[i] << " ";
}
return 0;
}

在這個例子中,我們想把 buf 中的每個元素都變成「2倍」,而且寫入到 buf1 中。

注意,我們是希望 buf 的內容不變,但 buf1 中的每個元素都是 buf 中每個元素的 2 倍!

我們呼叫了 transform 函式,由 buf 的開頭,掃描到 buf 的結尾,每掃描一個元素,就呼叫 doubleInt 這個自訂的函式。

transform 每把一個整數變成「2 倍」後,就會輸出。輸出的「目的」是由 buf1 的開頭(即 buf1.begin())開始,逐一的寫入整數。

在這個例子中,要確定 buf1 有足夠的空間,所以我們在第 19 行初始化 buf1 時,才會配置 5 個空間給它。

留言

這個網誌中的熱門文章

由 Pandas 的 DataFrame 中取得資料

[程式設計] C++ 的字串切割

[程式設計] UVa 介紹,以及 UDebug 和其他輔助工具的介紹