《c++ primer》学习笔记 第三章 标准库类型(string, vector,bitset)
(1)关于getline()函数
getline()有两个原型:
(1)istream& getline (istream& is, string& str, char delim);
(2)istream& getline (istream& is, string& str);
表示读取输入流对象is中的内容存储到字符串str中,直到遇到delim符号时终止,如果没有指定delim则直到遇到换行符(‘\n’)时终止(2)。
其中:is是输入流对象,通常为cin或文件流ifstream; str为储存输入内容的字符串,delim为输入终止符。
example:
(2)string::size_type类型// extract to string
#include <iostream>
#include <string>
main ()
{
std::string name;
std::cout << "please, enter your full name: ";
std::getline (std::cin,name);
std::cout << "hello, " << name << "!\n";
return 0;
}
string的size()函数的返回值也该是size_type类型,size_type是一个与机器无关的unsigned(unsigned int或unsigned long)类型。同样的位数,unsigned值是signed值的两倍,从这个角度来说,将size()的返回值赋给size_type比赋给int重要安全的多。将size()返回值赋给int时,很有可能会超出其表示范围。如,在16位int型机器上,int能表示的最大值为215=32767,而一个文件的字符数可以很轻松的超过这个值。
在定义用作索引的变量时,出于同样的道理,string 对象的索引变量最好也用 string::size_type 类型。因此在遍历string对象的字符时有:
for(string::size_type ix=0; ix!=str.size(); ++ix)
str[ix] = “*”;
与string类类似,vector对象的size()函数的返回值也是size_type类型。不过,vector 类型总是包括总是包括 vector 的元素类型。如:
vector<int>::size_type; // ok
vector::size_type; //error
(3)两个string对象相加, 和 字符串字面值连接
两个string对象相加可以用“+”、“+=”,如: string s1, s2; string str = s1+s2; str +=s1;
而两个字面值连接时去不能直接使用”+”: string str = “hello” + “world”; // error
原因是string类定义了operate+ 操作符,而字符数组没有。但字面值与字符串连接时,请确保在“+”号的两边至少有一个是string对象。当然,一下的语句也是正确的:
string str = s1 + “hello” + “world”;
因为string类的+操作符返回的是一个string对象,因此s1+”hello”返回一个string,再跟字面值”world”相加是可以的。
(4) string对象中字符的处理函数
i1
(5)迭代器iterator,const_iterator, const iterator
迭代器是一种检查容器内元素并遍历元素的数据类型。标准库为每一种标准容器(包括 vector)定义了一种迭代器类型。迭代器
类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。因为迭代器对所有的容器都适用,现代 c++ 程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的 vector 类型也是这样。
迭代器的应用举例:
// reset all the elements in ivec to 0
for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
ivec[ix] = 0;
const_iterator: 每种容器类型还定义了一种名为 const_iterator的类型,该类型只能用于读取容器内元素,但不能改变其值。
const 迭代器: 这种类型几乎没什么用处:一旦它被初始化后,只能用它来改写其指向的元素,但不能使它指向任何其他元素。
vector<int>::const_iterator; // an iterator that cannot write elements
const vector<int>::iterator; // an iterator whose value cannot change
(6) 标准库bieset
有些程序要处理二进制位的有序集,每个位可能包含 0(关)1(开)值。位是用来保存一组项或条件的 yes/no 信息(有时也称标志)的简洁方法。标准库提供的 bitset 类简化了位集的处理。
bitset对象上的操作:
i2
i3
关于bitset的使用,见日后总结。