# string.length() 的复杂度

C++ 11 以前是未定义,在 C++ 11 及以后为常数,使用时须注意。

# 字符串字面量

R "分隔符( 原始字符 )分隔符"

示例:R"66(\njjnb/)66" == "\\njjnb/"

分隔符也可以为空。示例 2:'R(njjnb)' == '\\njjnb/'

另有 L, u8, u, U 作为前缀,类似于66L,表示长charUTF-8UTF-16UTF-32字符。

string_literal (opens new window)

# cin >> string 的细节

只以空格为分隔符。输入 123:123,str 即为 123:123

# string 和 iostream 的关系

转载自:https://www.cnblogs.com/Solstice/archive/2011/07/17/2108715.html

iostream 可以与 string 配合得很好。但是有个问题:谁依赖谁?

std::stringoperator <<operator >> 是如何声明的?string 头文件在声明这两个 operators 的时候要不要 include iostream

iostreamstring 都可以单独 include 来使用,显然 iostream 头文件里不会定义 string<<>> 操作。但是,如果 string 要include iostream,岂不是让 string 的用户被迫也用了 iostream?编译 iostream 头文件可是相当的慢啊(因为 iostream 是 template,其实现代码都放到了头文件中)。

标准库的解决办法是定义 iosfwd 头文件,其中包含 istreamostream 等的前向声明 (forward declarations),这样 string 头文件在定义输入输出操作符时就可以不必包含 iostream,只需要包含简短得多的 iosfwd。我们自己写程序也可借此学习如何支持可选的功能。

值得注意的是,istream::getline() 成员函数的参数类型是 char*,因为 istream 没有包含 string,而我们常用的 std::getline() 函数是个 non-member function,定义在 string 里边。

我注:这也解释了,cin 的所有成员函数都不支持 string,只能只用非成员函数 getline(在 string 中) 或 operator >>(在 xstring 中)。