进一步探讨 string 类型
[0. 回望复习]
之前介绍了 string 类型,表 9.12 扼要重述了在该节中介绍的 string 操作。
// 表 9.12 string s; 定义一个新的空 string 对象,命名为 s string s(cp); 定义一个新的 string 对象,用 cp 所指向的(以空字符 null 结束的)C 风格字符串初始化该对象 string s(s2); 定义一个新的 string 对象,并将它初始化为 s2 的副本 is >> s; 从输入流 is 中读取一个以空白字符分隔的字符串,写入 s os << s; 将 s 写到输出流 os 中 getline(is, s) 从输入流 is 中读取一行字符,写入 s s1 + s2 把 s1 和 s2 串接起来,产生一个新的 string 对象 s1 += s2 将 s2 拼接在 s1 后面 关系操作符 相等运算(== 和 !=)以及关系运算(<、<=、> 和 >=) 都可用于 string 对象的比较,等效于(区分大小写的)字典次序的比较
除了已经使用过的操作外,string 类型还支持大多数顺序容器操作。
在某些方面,可将 string 类型视为字符容器。
除了一些特殊操作,string 类型提供与 vector 容器相同的操作。
string 类型与 vector 容器不同的是,它不支持以栈方式操纵容器:
在 string 类型中不能使用 front、back 和 pop_back 操作。
// string 支持的容器操作有: 1.typedef:包括迭代器类型。 (size_type, iterator, const_iterator,reverse_iterator, const_reverse_iterator, difference_type, value_type, reference, const_referenc ) 2. 容器构造函数。 (C<T> c; C c(c2); C c(b, e); C c(n, t)) 3. vector 容器所提供的添加元素的操作。 (c.push_back(t); c.push_front(t); c.inset(p, t); c.insert(p, n, t); c.insert(p, b, e); ) 注意:无论 vector 容器还是 string 类型都不支持 push_front 操作。 4. 长度操作。 (c.size(); c.max_size(); c.empty(); c.resize(); c.resize(n, t);) 5. 下标和 at 操作。 (c[n], c.at(n) ) 6. begin 和 end 操作。 (c.begin(); c.end(); c.rbegin(); c.rend(); ) 7. erase 和 clear 操作。 (c.erase(p); c.erase(b, e); c.clear(); ) 8. 赋值操作。 (c1=c2; c1.swap(c2); c.assign(b, e); c.assign(n, t); ) 9. 与 vector 容器的元素一样,string 的字符也是连续存储的。 因此,string 类型支持 capacity 和 reserve 操作。
string 类型提供容器操作意味着可将操纵 vector 对象的程序改写为操纵 string 对象
例如,以下程序使用迭代器将一个 string 对象的字符以每次一行的方式输出到标准输出设备:
string s("Hiya!"); string::iterator iter = s.begin(); while (iter != s.end()) cout << *iter++ << endl; // postfix increment: print old value
除了共享容器的操作外,string 类型还支持其他本类型特有的操作。
在本节剩下的篇幅吕,我们将回顾这些 string 类型特有的操作,
包括与其他容器相关操作的补充版本,以及全新的函数。
string 类型的补充函数将在以后介绍。
string 类型为某些容器操作提供补充版本,以支持 string 特有的、不为其他容器共享的属性。
例如,好几种操作允许指定指向字符数组的指针参数。
无论字符串是否以空字符结束,这些操作都支持标准库 string 对象与字符数组之间的紧密交互作用。
其他版本则使程序员只能使用下标而不能使用迭代器。
这些版本只能通过位置操纵元素:
指定起始位置,在某些情况下还需指定一个计数器,由此指定要操纵的某个元素或一段元素。
/** * string 库定义了大量使用重复模式的函数。
* * 由于该类型支持的函数非常多,初次阅读本节是会觉得精神疲累。 *
* 后续详细内容见《 进一步探讨 string 类型(续) 》。 **/