从本科大三学了 Python 之后,基本就一直在用 Python,除了部分课程作业用 Java 完成项目以及研一暑假时学了一小段时间的 R。
尤其是研二初学会了 Python 的 numpy 和 pandas 库之后,基本也没有再遇到过性能问题。因为我写代码主要是为了科研数据处理,多数情况都可以把问题向量化。
2019 年秋招开始后,也用着 Python 刷了 LeetCode 的前 70 多道题,遇到一些无法向量化的问题,这时候 Python 的性能劣势就体现出来了。其中,最主要的一点是,Python 的封装实在太高级了,在使用时用户对很多内建函数的复杂度都没有概念。所以,花了一周多时间复习完 C++ 语法后,我开始用 C++ 刷 LeetCode。
这篇博文是比较 Python 和 C++ 在字符串处理中的不同。
定义字符串
Python
不区分字符与字符串,单引号与双引号可以替换使用1
2char0 = "A"
str0 = "Hello World!"
C++
区分字符与字符串,字符用单引号,字符串用双引号1
2
3
4
5
6char c0 = 'A';
char str0[] = "Hello World!";
string str1 = "Hello World!";
string str2(str0);
string str3(5, c0);
截取字符串
Python
字符串可以用切片截取;字符串是 Immutable,不可修改的1
2
3
4
5str0 = "Hello World!"
print(str0[1]) # 输出 "e"
print(str0[1:4]) # 输出 "ell"
str0[1] = "A" # 会报错
C++
字符串可以用下标访问或修改对应位置字符1
2
3
4string str1 = "Hello World!";
cout << str1[3] << endl; // 输出字符 'l'
str1[3] = 'U';
cout << str1 << endl; // 输出字符串 "HelUo World!"
使用 string
类自带的函数 substr
来截取字符;具体地,substr(pos, n)
返回 pos
开始的 n
个字符组成的字符串1
cout << str1.substr(3, 5) << endl; // 输出 "Uo Wo"
连接字符串
Python
1 | str0 = "Hello World!" |
C++
1 | cout << str1 + str2 << endl; // 输出 "HelUo World!Hello World!" |
字符串长度
Python
1 | str0 = "Hello World!" |
C++
1 | cout << str1.size() << " " << str1.length() << endl; // 输出 36 36 |
字符串查找
Python
使用 str
类的 find
和 index
函数进行查找;其中,find
在查找失败时返回 -1,而 index
查找失败时报错1
2
3
4
5
6
7str0 = "Hello World!"
print("A" in str0) # 输出 False
print(str0.find("W")) # 输出 6
print(str0.find("A")) # 输出 -1
print(str0.index("W")) # 输出 6
print(str0.index("A")) # 报错
C++
使用 string
类的 查找成功时返回所在位置,失败返回 string::npos
的值1
2
3cout << str1.find('o') << endl; // 输出 4
cout << str1.find("llo") << endl; // 输出 14
cout << str1.find('A') << " " << str1.npos << endl; // 输出 18446744073709551615 18446744073709551615
字符串替换、插入
Python
1 | str0 = "Hello World!" |
C++
从下标为 2 的位置开始,删除 4 个字符,并替换为 “ZEW”1
str1.replace(2, 4, "ZEW");
把 “SYUONI” 插入,并使得其开始位置下标为 21
str1.insert(2, "SYUONI");
统计子串出现次数
Python
1 | str0 = "Hello World!" |
补齐长度
Python
1 | str0 = "Hello World!" |