1.原始字符串
C++11引入了字面量前缀“R”表示原始字符串,明确表示字符串保持原始形式,避免转义。
#include <iostream>
#include <string>
int main()
{
auto str1 = R"(char""'')";
auto str2 = R"(\r\n\t\")";
auto str3 = R"(\\\$)";
auto str4 = "\\\\\\$";
std::cout <<"str1 = "<< str1 <<std::endl;
std::cout <<"str2 = "<< str2 <<std::endl;
std::cout <<"str3 = "<< str3 <<std::endl;
std::cout <<"str4 = "<< str4 <<std::endl;
}
运行结果:
str1 = char""''
str2 = \r\n\t\"
str3 = \\\$
str4 = \\\$
2.字面量后缀
C++14引入了字面量后缀“s”,明确表示字符串的类型是string。
#include <iostream>
#include <string>
using namespace std::literals::string_literals;
int main()
{
auto str = "std string"s;
std::cout << "time"s.size();
}
注:(1)必须打开命名空间std::literals::string_literals才能使用。
(2)标准字符串可以直接调用成员函数。
运行结果:
4
3.字符串视图类
C++17中引入一种轻量级的字符串视图类型std::string_view。它
内部只保存一个指针和长度,无论是拷贝,还是修改,成本都很低。
#include <iostream>
#include <string>
#include <string_view>
int main()
{
const char* cstr = "Hello world! I am Beijing";
std::string str = "Hello world! I am Beijing";
std::string_view stringView(str);
std::cout << "cstr: " << sizeof(cstr) << std::endl;
std::cout << "str: " << sizeof(str) << std::endl;
std::cout << "stringView: " << sizeof(stringView) << std::endl;
}
运行结果:
cstr: 8
str: 40
stringView: 16
注:(1)sizeof(cstr) 返回的是指针本身在内存中占用的字节数。我的机器是64位系统,指针通常占用8个字节,因此返回8。
(2)sizeof(str) 返回对象 str
在内存中占用的字节数。它通常包含一个指针(指向字符串的数据);一个整数(存储字符串的长度);一个整数(存储字符串的容量);额外的管理数据(某些实现中有引用计数等)。
(3)sizeof(stringView)返回字符串视图类型的在内存中占用的字节数。它通常包含一个指针和长度。我的机器是64位系统,指针通常占用8个字节,整型长度通常占用8个字节,因此返回16。