string

当使用加号运算符时,加号两边至少得有一个是 string 类型

1
2
3
4
5
6
7
8
9
10
11
12
string s1 = "hello", s2 = "world";
string s3 = s1 + ", " + s2 + ’\n’; // valid

string s4 = s1 + ", "; // valid
string s5 = "hello" + ", "; // invalid

string s6 = s1 + ", " + "world"; // valid
// 等效于
string s6 = (s1 + ", ") + "world";

string s7 = "hello" + ", " + s2; // invalid
string s7 = "hello" + (", " + s2); // valid

"xxx" 实际上是 char* 类型,string 类定义了一种 char *string 的转换功能,这使得可以使用 C-风格字符串来初始化 string 对象,可以用 c_str() 函数返回 C-风格字符串

1
2
3
4
string s = "qwt";
char *str = s; // error: can’t initialize a char* from a string
// 如果
const char *str = s.c_str(); // ok,c_str() 返回 C 风格字符串

几个常用成员函数

1
2
3
4
string s = "qwt";
cout << s.size() << endl; // 字符串长度
cout << s.length() << endl; // 字符串长度,一般用这个
cout << s.empty() << endl; // 字符串判空

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// C 风格字符串输入
char qwt[75];
cin >> qwt;
cin.getline(qwt, 7); // 7 包含了空字符串
cin.get(qwt, 5);

// string 输入
string qwt;
cin >> qwt;
getline(cin, qwt);
getline(cin, str, '$'); // 指定字符确定输入边界

// scanf 输入
string qwt;
qwt.resize(10);
scanf("%s", &qwt[0]);
printf("%s\n", qwt.c_str());

访问元素

1
string qwt = "75t";

使用下标

1
2
3
string qwt = "75t";
for (int i = 0; i < qwt.length(); i++)
cout << qwt[i] << endl;

基于范围循环,range-based loop

1
2
for (auto ch: qwt)
cout << ch << endl;

使用 迭代器

1
2
for (auto it = qwt.begin(); it != qwt.end(); ++it)  
cout << *it << endl;

修改元素

1
2
3
4
5
6
7
8
// 使用引用,可修改内容
for (auto &ch : qwt)
ch = toupper(ch); // 将字符改成大写

// 使用下标也可以修改
for (int i = 0; i < qwt.length(); i++)
qwt[i] = toupper(qwt[i]);

构造函数

NBTS 表示空字符串结尾的传统 C 字符串

构造函数 描述
string(const char * s) 将 string 对象初始化为 s 指向的 NBTS
string(size_type n, char c) 创建一个包含 n 个元素的 string 对象,其中每个元素都被初始化为字符 c
string(const string & str) 将一个 string 对象初始化为string对象str (复制构造函数)
string() 创建一个默认的 string 对象,长度为 0 (默认构造函数)
string(const char * s, size_type n) 将 string 对象初始化为 s 指向的 NBTS 的前 n 个字符,即使超过了 NBTS 结尾
template <class Iter > string(lter begin, Iter end) 将 string 对象初始化为区间内的字符,其中 begin 和 end 的行为就像指针,用于指定位置,范围包括 begin 在内,但不包括 end
string(const string & str, string size type pos = 0, size_type n = npos) 将一个 string 对象初始化为对象 str 中从位置 pos 开始到结尾的字符, 或从位置 pos 开始的 n 个字符
string(string && str) noexcept 这是 C++11 新增的,它将一个 string 对象初始化为 string 对象 str,并可能修改 str(移动构造函数)
string(initializer_list <char> il) 这是 C+11 新增的,它将一个 string 对象初始化为初始化列表 il 中的字符

cctype 库

函数 描述
isalnum(c) true if c is a letter or a digit.
isalpha(c) true if c is a letter.
iscntrl(c) true if c is a control character.
isdigit(c) true if c is a digit.
isgraph(c) true if c is not a space but is printable.
islower(c) true if c is a lowercase letter.
isprint(c) true if c is a printable character (i.e., a space or a character that has a visible representation).
ispunct(c) true if c is a punctuation character (i.e., a character that is not a control character, a digit, a letter, or a printable whitespace).
isspace(c) true if c is whitespace (i.e., a space, tab, vertical tab, return, newline, or formfeed).
isupper(c) true if c is an uppercase letter.
isxdigit(c) true if c is a hexadecimal digit.
tolower(c) If c is an uppercase letter, returns its lowercase equivalent; otherwise returns c unchanged.
toupper(c) If c is a lowercase letter, returns its uppercase equivalent; otherwise returns c unchanged.