分享

第一部分 基础语言之二标准库类型

 君王之王 2016-02-29

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)
  • iter + n
  • iter - n
  • iter1 - iter2
最后一个表达式用来计算两个迭代器对象的距离,该距离是名
为 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

 
 





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多