Skip to content

Commit 15c76e6

Browse files
committed
Update public notes
1 parent f39648e commit 15c76e6

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

content/编程相关/编程语言/Cpp 之旅 第三版 读书笔记.md

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,4 +1040,63 @@ void g(vector<int>& v) {
10401040
- 使用 ranges 时,显式限定算法名称。
10411041
- 如有可能,尽量用 import 模块代替 `#inclued` 头文件。
10421042

1043-
#todo
1043+
## 第10章 字符串和正则表达式
1044+
1045+
C++ 有 string 类型,也有 string_view 类型——以容器方式访问字符序列,不论是在 std::string 还是 `char[]`
1046+
1047+
string 和 regex 都支持多种字符类型比如说 unicode.
1048+
1049+
### string 类型
1050+
1051+
用 + 可以对字符串进行链接。string 定义了移动构造函数,所以用传值方式返回也同样高效。
1052+
1053+
string.substr 提取子串,string.replace 替换,toupper 大写。
1054+
1055+
可以用`[]`索引 string,at() 类似。
1056+
1057+
可以和 string、c风格字符串、字面量比较。
1058+
1059+
用 c_str() 和 data() 可以以 c风格字符串 只读访问 string 的内容。
1060+
1061+
string 类型字面量的后缀是 s (`std::literals::string_literals`
1062+
1063+
### 字符串实现
1064+
1065+
用了 短字符串优化技术 SSO,意思是短字符串会被存在 string 对象内部,长字符串会被存在 自由存储 中。
1066+
1067+
*不过标准没规定要多少字符就扔自由存储,这要看具体实现。*
1068+
1069+
为了处理多字符集,标准库给了一个通用的字符串模板 `basic_string` , string 实际上是这个模板的实例化 `using string = basic_string<char>;`
1070+
1071+
### 字符串视图
1072+
1073+
字符串视图出现,是为了解决未出现在标准库(即自定义)字符串类型传递子串的问题。string_view 本质上是(指针,长度)对,标明了一个字符串序列。
1074+
1075+
string_view 是只读的。如果想要写版本的,用 span。
1076+
1077+
string_view 要当成指针用,因为可能会造成越界访问。
1078+
1079+
```cpp
1080+
string_view bad() {
1081+
string s = "Once upon a time.";
1082+
return {&s[5], 4};
1083+
}
1084+
```
1085+
1086+
返回前 s 就已经销毁了。
1087+
1088+
### 正则表达式
1089+
1090+
`<regex>`
1091+
1092+
一个例子是这样:
1093+
1094+
```cpp
1095+
regex pat {R"(\w{2}\s*\d{5}(-\d{4})?)"};
1096+
```
1097+
1098+
`R"()"` 这种就是 **原始字符串字面量 raw string literal**。这种原始字符串字面量不用转义。
1099+
1100+
regex_match 正则和字符串匹配
1101+
regex_search 搜索和正则匹配的字符串
1102+
regex_replace

0 commit comments

Comments
 (0)