在头文件中最好使用完全限定的标准库名字,防止其中的using声明被应用于包含此头文件的源文件中。
3.2.2
cin>>string; //从第一个非空白字符到第一个空白字符,空白符任然存在于输入流中
getline(cin,line); //读取到第一个换行符,并将换行符舍弃后存入line,换行符从输入流中除去
3.2.3
string对象和字符串字面值连接时,“+”操作符左右至少有一个string对象。
string s1 = "hello"; // no punctuation
string s2 = "world";
string s3 = s1 + ", "; // ok: adding a string and a literal
string s4 = "hello" + ", "; // error: no string operand
string s5 = s1 + ", " + "world"; // ok: each + has string operand
string s6 = "hello" + ", " + s2; // error: can't add string literals
3.4
const 迭代器是迭代器常量,该迭代器本身的值不能修改,即该迭代器在定义时需要初始化,而且初始化之后,不能再指向其他元素。若需要指向固定元素的迭代器,则可以使用 const 迭代器。const_iterator 是一种迭代器类型,对这种类型的迭代器解引用会得到一个指向 const 对象的引用,即通过这种迭代器访问到的对象是常量。该对象不能修改,因此,const_iterator 类型只能用于读取容器内的元素,不能修改元素的值。若只需遍历容器中的元素而无需修改它们,则可以使用 const_iterator。
3.5 bitset
bitset<n> b; | b有n位,每位都为0 |
---|---|
bitset<n> b(u); | b是unsigned long u的一个副本 |
bitset<n> b(s); | b是string对象s中含有位串的副本 |
bitset<n> b(s,pos,n); | b是s中从位置pos开始的n个位的副本 |
在 32 位 unsigned long 的机器上,十六进制值 0xffff 表示为二进制位就是十六个 1 和十六个 0(每个 0xf 可表示为 1111)。可以用 0xffff 初始化 bitset 对象:
// bitvec1 is smaller than the initializer
bitset<16> bitvec1(0xffff); // bits 0 ... 15 are set to 1
// bitvec2 same size as initializer
bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1,16 ... 31 are 0
// on a 32-bit machine, bits 0 to 31 initialized from 0xffff
bitset<128> bitvec3(0xffff); // bits 32 through 127initialized to zero
用 string 对象初始化 bitset 对象
当用 string 对象初始化 bitset 对象时,string 对象直接表示为位模式。从 string 对象读入位集的顺序是从右向左(from right to left):string strval("1100");
bitset<32> bitvec4(strval);
bitvec4 的位模式中第 2 和 3 的位置为 1,其余位置都为 0。如果 string 对象的字符个数小于 bitset 类型的长度,则高阶位置为 0。
string 对象和 bitsets 对象之间是反向转化的:string 对象的最右边字符(即下标最大的那个字符)用来初始化 bitset 对象的低阶位(即下标为 0 的位)。当用 string 对象初始化 bitset 对象时,记住这一差别很重要。
不一定要把整个 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 4characters
这里用 str 从 str[5] 开始包含四个字符的子串来初始化 bitvec5。照常,初始化 bitset 对象时总是从子串最右边结尾字符开始的,bitvec5 的从 3 到 0 的二进制位置为 1100 ,其他二进制位都置为 0。如果省略第三个参数则意味着取从开始位置一直到 string 末尾的所有字符。本例中, 取出 str 末尾的四位来对 bitvec6 的低四位进行初始化。bitvec6 其余的位初始化为 0。
bitset操作
其操作大多数是针对于“1”的操作,如b.any( )是测试b中是否存在置为1的二进制位。有几个特殊的操作符:
b.flip( ) | 将b中所有二进制位取反 |
b.to_ulong( ) | 将b中同样的二进制位返回一个unsigned long值 |
os<<b | 把b中的位集输出到os流 |
bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ...31 are 0
cout << "bitvec2: " << bitvec2 << endl;
输出结果为:bitvec2: 00000000000000001111111111111111