2023年7月29日 星期六

Python 及 C++ 遍歷字串

作者:王一哲
日期:2023年7月29日



前言


由於我大約一年前開始寫 APCS、ZeroJudge 的題目,最近又開始寫 LeetCode,我會先用比較熟悉的 Python 解題,確定程式碼的邏輯正確後,再用 C++ 重寫一遍。在重寫的過程中,因為我對於 C++ 的語法不太熟悉,經常需要上網找資料,沒想到現在 C++ 多了很多方便的工具,甚至有些寫法跟 Python 很像。

遍歷字串是指依序讀取字串中的字元並做一些處理,例如將每個字元依照 ASCII 編碼加1,再儲存到另一個字串中,以下是 Python 及 C++ 的寫法。

Python 語法



方法1:使用 for 迴圈及索引值



Python 中的字串類似由字元組成的陣列,索引值由 0 開始,可以用索引值取出字串中的內容。方法1是用 for 迴圈,將變數 i 的值依序由 0、1、2、... 代入,直到(字串長度 - 1)為止,再用 s[i] 就可以依序讀取字串中的字元。
s = "Hello World!"
s2 = ""

for i in range(len(s)):
    s2 += chr(ord(s[i])+1)
print(s2)


方法2:使用 for 迴圈並暫存字元



Python 的 for 迴圈有一種特別的用法,可以由 in 後方的物件依序取出元素,例如第3行,就是將字串 s 中的字元依序取出並暫存於變數 c,變數 c 在離開 for 迴圈時就會消失。
s = "Hello World!"
s2 = ""
for c in s:
    s2 += chr(ord(c)+1)
print(s2)


以上兩種寫法印出的字串 s2 內容皆為Ifmmp!Xpsme"


C++ 語法



方法1:使用 for 迴圈及索引值



如果要在 C++ 中使用字串物件,需要先引入函式庫string,變數的格式名稱就是string。如果想要取得字串 s 的長度,可以用s.size(),回傳值的格式為size_t,是沒有正負號的整數。由於字串類似由字元組成的陣列,索引值由 0 開始,可以用索引值取出字串中的內容。方法1是用 for 迴圈,將變數 i 的值依序由 0、1、2、... 代入,若 i 小於字串長度繼續執行迴圈,再用 s[i] 就可以依序讀取字串中的字元。有一個需要注意之處,變數 i 的格式要使用 size_t不要使用 int,否則編譯時可能會有警告或是編譯失敗。
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "Hello World!", s2 = "";
    for(size_t i=0; i<s.size(); i++) {
        s2 += char(s[i]+1);
    }
    cout << s2 << endl;
    return 0;
}


方法2:使用 for 迴圈及迭代器 iterator



C++ 標準樣版函式庫 (Standard Template Library, STL) 提供了迭代器 (iterator),如果要使用字串的迭代器可以寫成 string::iterator,甚至可以用 auto 由後方的物件自動判斷迭代器的種類,由於迭代器的值是記憶體位置,如果要取出記憶體位置代表的內容需要在前面加上星號 *,如果還要對這個值再做運算,要再加上括號 (),例如(*it)
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "Hello World!", s2 = "";
    for(string::iterator it = s.begin(); it != s.end(); it++) {
    //for(auto it = s.begin(); it != s.end(); it++) {
        s2 += char((*it)+1);
    }
    cout << s2 << endl;
    return 0;
}


方法3:使用 for 迴圈並暫存字元



這個方法很像 Python 的語法,for(auto c : s) 會將字串 s 的字元依序取出並存到變數 c。
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "Hello World!", s2 = "";
    for(auto c : s) {
        s2 += char(c+1);
    }
    cout << s2 << endl;
    return 0;
}


以上三種寫法印出的字串 s2 內容皆為Ifmmp!Xpsme"


結語



現在的 C++ 多了很多方便的工具,我之後會在寫一些筆記,才不會過幾個月沒碰就忘光了。



HackMD 版本連結:https://hackmd.io/@yizhewang/B1BFZsGs2

沒有留言:

張貼留言