0%

Python 和 C++ 字符串比较

从本科大三学了 Python 之后,基本就一直在用 Python,除了部分课程作业用 Java 完成项目以及研一暑假时学了一小段时间的 R。
尤其是研二初学会了 Python 的 numpy 和 pandas 库之后,基本也没有再遇到过性能问题。因为我写代码主要是为了科研数据处理,多数情况都可以把问题向量化。
2019 年秋招开始后,也用着 Python 刷了 LeetCode 的前 70 多道题,遇到一些无法向量化的问题,这时候 Python 的性能劣势就体现出来了。其中,最主要的一点是,Python 的封装实在太高级了,在使用时用户对很多内建函数的复杂度都没有概念。所以,花了一周多时间复习完 C++ 语法后,我开始用 C++ 刷 LeetCode。
这篇博文是比较 Python 和 C++ 在字符串处理中的不同。

定义字符串

Python

不区分字符与字符串,单引号与双引号可以替换使用

1
2
char0 = "A"
str0 = "Hello World!"

C++

区分字符与字符串,字符用单引号,字符串用双引号

1
2
3
4
5
6
char c0 = 'A';
char str0[] = "Hello World!";

string str1 = "Hello World!";
string str2(str0);
string str3(5, c0);

截取字符串

Python

字符串可以用切片截取;字符串是 Immutable,不可修改的

1
2
3
4
5
str0 = "Hello World!"
print(str0[1]) # 输出 "e"
print(str0[1:4]) # 输出 "ell"

str0[1] = "A" # 会报错

C++

字符串可以用下标访问或修改对应位置字符

1
2
3
4
string 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
2
str0 = "Hello World!"
print(str0 + str0) # 输出 "Hello World!Hello World!"

C++

1
2
3
4
5
cout << str1 + str2 << endl;     // 输出 "HelUo World!Hello World!"
str1 += str2;
cout << str1 << endl; // 输出 "HelUo World!Hello World!"
str1.append(str2);
cout << str1 << endl; // 输出 "HelUo World!Hello World!Hello World!"

字符串长度

Python

1
2
str0 = "Hello World!"
print(len(str0)) # 输出 12

C++

1
2
cout << str1.size() << " " << str1.length() << endl;  // 输出 36 36
cout << str1.empty() << endl; // 输出 false

字符串查找

Python

使用 str 类的 findindex 函数进行查找;其中,find 在查找失败时返回 -1,而 index 查找失败时报错

1
2
3
4
5
6
7
str0 = "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
3
cout << str1.find('o') << endl;       // 输出 4
cout << str1.find("llo") << endl; // 输出 14
cout << str1.find('A') << " " << str1.npos << endl; // 输出 18446744073709551615 18446744073709551615

字符串替换、插入

Python

1
2
str0 = "Hello World!"
print(str0.replace("l", "L")) # 输出 "HeLLo WorLd!"

C++

从下标为 2 的位置开始,删除 4 个字符,并替换为 “ZEW”

1
str1.replace(2, 4, "ZEW");

把 “SYUONI” 插入,并使得其开始位置下标为 2
1
str1.insert(2, "SYUONI");

统计子串出现次数

Python

1
2
str0 = "Hello World!"
print(str0.count("l")) # 输出 3

补齐长度

Python

1
2
3
str0 = "Hello World!"
print(str0.ljust(20, "-")) # 输出 "Hello World!--------"
print(str0.rjust(20, "-")) # 输出 "--------Hello World!"