2.1 标准库string类型 2.2.1 string 对象的定义和初始化 string 标准库支持几个构造函数,当没有明确指定对象初始化式时,系统将使用默认构造函数 几种初始化string 对象的方式 string s1; //默认构造函数 s1 为空串 string s2(s1); //将 s2 初始化为 s1 的一个副本 string s3("value"); //将 s3 初始化为一个字符串字面值副本 string s4(n, 'c'); //将 s4 初始化为字符 'c' 的 n 个副本 警告:标准库string 类型和字符串字面值 为了与 C 语言兼容,字符串字面值与标准库 string 类型不是同一种类型。 2.2.2 string 对象的读写 cin >> s; // read whitespace-separated string into s 从标准输入读取 string 并将读入的串存储在 s 中。string 类型的输入操作符: · 读取并忽略开头所有的空白字符(如空格,换行符,制表符)。 · 读取字符直至再次遇到空白字符,读取终止。 和内置类型的输入操作一样,string 的输入操作符也会返回所读的数据流。 因此,可以把输入操作作为判断条件: int main() { string word; // read until end-of-file, writing each word to a new line while (cin >> word) cout << word << endl; return 0; } 使用getline 读取整行文本 另外还有一个有用的 string IO 操作:getline。这个函数接受两个参数: 一个输入流对象和一个 string 对象。getline 函数从输入流的下一行读取,并 保存读取的内容到不包括换行符。和输入操作符不一样的是,getline 并不忽略 行开头的换行符和空格 int main() { string line; // read line at time until end-of-file while (getline(cin, line)) cout << line << endl; return 0; } 2.2.3 string 对象的操作 s.empty() //如果 s 为空串,则返回 true,否则返回 false。 s.size() //返回 s 中字符的个数 s[n] //返回 s 中位置为 n 的字符,位置从 0 开始计数 s1 + s2 //把 s1 和s2 连接成一个新字符串,返回新生成的字符串 s1 = s2 //把 s1 内容替换为 s2 的副本 v1 == v2 //比较 v1 与 v2 的内容,相等则返回 true,否则返回 false !=, <, <=, >, and >= //保持这些操作符惯有的含义 string 类类型和许多其他库类型都定义了一些配套类型(companion type)。 通过这些配套类型,库类型的使用就能与机器无关(machine-independent)。 size_type 就是这些配套类型中的一种。它定义为与 unsigned 型(unsigned int 或 unsigned long)具有相同的含义,而且可以保证足够大能够存储任 意 string 对象的长度,string::size_type 来保存字符串长度 关系操作符比较两个 string 对象时采用了和(大小写敏感的)字典排序相同的策略: · 如果两个 string 对象长度不同,且短的 string 对象与长的 string 对 象的前面部分相匹配,则短的 string 对象小于长的 string 对象。 · 如果 string 对象的字符不同,则比较第一个不匹配的字符。string 赋值操作后 // st1 is an empty string, st2 is a copy of the literal string st1, st2 = "The expense of spirit"; st1 = st2; // replace st1 by a copy of st2 大多数 string 库类型的赋值等操作的实现都会遇到一些效率上的问题,但 值得注意的是,从概念上讲,赋值操作确实需要做一些工作。它必须先把 st1 占 用的相关内存释放掉,然后再分配给 st2 足够存放 st2 副本的内存空间,最后 把 st2 中的所有字符复制到新分配的内存空间。 字符串连接 当进行 string 对象和字符串字面值混合连接操作时,+ 操作符的左右操作 数必须至少有一个是 string 类型的 2.2.4 string 对象中字符的处理 2.2 标准库vector类型 vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。 vector 类型的每一种都指定了其保存元素的类型。因此,vector<int> 和 vector<string> 都是数据类型。 2.2.1 vector 对象的定义和初始化 vector 元素连续存储,可能希望最好是预先分配合适的空间。 但事实上,为了达到连续性,C++ 的做法恰好相反 2.2.2 迭代器 每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。如 果容器中有元素的话,由 begin 返回的迭代器指向第一个元素: vector<int>::iterator iter = ivec.begin(); end 操作返回的迭代器并不指向 vector 中任何实际的元 素,相反,它只是起一个哨兵(sentinel)的作用,表示我们 已处理完 vector 中所有元素。 const_iterator 前面的程序用 vector::iterator 改变 vector 中的元素值。每种容器类型 还定义了一种名为 const_iterator 的类型,该类型只能用于读取容器内元素, 但不能改变其值。 不要把 const_iterator 对象与 const 的 iterator 对象混淆起来。声明 一个 const 迭代器时,必须初始化迭代器。一旦被初始化后,就不能改变它的 值: vector<int> nums(10); // nums is nonconst const vector<int>::iterator cit = nums.begin(); *cit = 1; // ok: cit can change its underlying element ++cit; // error: can't change the value of cit 迭代器算术操作(iterator arithmetic)
最后一个表达式用来计算两个迭代器对象的距离,该距离是名 为 difference_type 的 signed 类型 size_type 的值,这里 的 difference_type 是 signed 类型,因为减法运算可能产生负数的结 果。该类型可以保证足够大以存储任何两个迭代器对象间的距离。 2.3 标准库bitset类型 2.3.1. bitset 对象的定义和初始化 bitvec 的位序是从 0 到 31。以 0 位开始的位串是低阶位(low-order),以 31 位结束的位串是高阶位(high-order)。 用string 对象初始化 bitset 对象 当用 string 对象初始化 bitset 对象时,string 对象直接表示为位模式。 从 string 对象读入位集的顺序是从右向左(from right to left): string strval("1100"); bitset<32> bitvec4(strval); 不一定要把整个 string 对象都作为 bitset 对象的初始值。相反,可以只 用某个子串作为初始值: string str("1111111000000011001101"); bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100 bitset<32> bitvec6(str, str.size() - 4); // use last 4 characters |
|