注:本文内容来自《C++20高级编程》,作为笔记
1 动态字符串
1.1 C风格的字符串
1.C语言中,字符串的最后一个字符是null字符(\0),官方将这个null字符定义为NUL,只有一个L。
2. <cstring>中,strlen()返回的是字符串的长度,而不是实际内存的长度,实际内存在字符串长度的基础上加1,因为结尾的'\0'。
3. 若char[]的字符串,sizeof()返回实际内存大小,而char*存储的字符串sizeof()返回的是指针的大小,根据平台各不相同,是const char*的大小。
4. 使用“安全C库”(ISO/IEC TR 24731)标准,能避免一些警告。
1.2 字符串字面量(string literal)
1.2.1 字面量池(literal pooling)
字符串字面量实际上存储在内存的只读部分,通过这种方式,编译器可重用相同字符串字面量的引用,从而优化内存使用。这种技术称为字面量池(literal pooling)。
char arr[]{"hello"};
arr[1]='a';
这种情况编译器会创建一个足以放下整个字符串的数组,然后将字符串复制到数组中,而不会将字面量放在只读的内存中,也不会使用字面量池。
1.2.2 原始字符串字面量(raw string literal)
R"(......)"
这种方式会忽略中间的转义字符,如\t \n等,若想插入)",必须用可选的分隔符,例如:
const char* str{ R"-(Embedded)" characters)-"};
1.3 C++std::string类
虽然string是一个类,但是几乎可以把string当作内建类型使用。
重载了+,表示串联字符串。
重载了+=,表示追加一个字符串。
string的内存会自动分配,不会出现内存泄漏。
一些操作:
substr(pos,len);返回从给定位置开始的给定长度的字符串
find(str);找到返回位置,没找到返回string::npos
replace(pos,len,str);指定位置和长度替换为另一个字符串
starts_with(str)/ends_with(str)如果以一个给定的字符串开头或结尾,返回true
从C++20开始,std::string是constexpr类,这意味着string可以用于在编译期执行操作,并可用于constexpr函数和类的实现。
auto string{"Hello World"s };可以把字符串字面量解释为std::string而不是const char*.
使用vector<string>时要注意vector names{"Name1"s,"Name2"s,"Name3"s};
string s{to_string(T val)};
高级数值转换和低级数值转换。