C++ Primer 第三章 标准库类型

来源:互联网 发布:手机查看gta5角色数据 编辑:程序博客网 时间:2024/04/28 09:25

C++定义了两种最重要的标准库类型:string 和 vector,它们分别定义了大小可变的字符串和标准库。其中,string类型支持长度可变的字符串,vector可用于保存一组指定类

型的对象。

3.2 标准库string 类型

string类型支持长度可变的字符串,用户程序要使用string类型对象,必须包含相关头文件。

#include <string>

3.2.2 String对象的读写

#include <iostream>#include <string>using namespace std;int main(){string s;cin >> s;cout << s << endl;return 0;}

从标准输入读取string,并将结果存储在s中。string类型的输入操作符:

1).读取并忽略开头所有的空白字符(比如空格、换行符、制表符)

2).读取字符直至再次遇到空白字符,读取终止。

比如输入“  HELLO WORLD  ”,(开头跟结尾都有空格),则屏幕上输出“HELLO”,而不含任何空格。


如果把多个读操作或者多个写操作放在一起:


string s1,s2;cin >> s1 >> s2;cout << s1 << s2 << endl;



2. 用getline读取整行文本

getline接受两个参数:一个输入流对象(比如cin)和一个string对象。保存读取内容到string中,但不包括换行符,不忽略行开头的换行符。如果第一个字符是换行符,则

string参数将置为空string。

int main(){        string line;while (getline(cin,line))cout << line << endl;return 0;}



注解:由于getline函数返回时丢弃换行符,换行符将不会存储在string中。

3.2.3 string对象的操作

1.string的size和empty操作

string对象的长度指的是string对象中字符的个数(包括空格和换行符等),可以通过size操作获取

int main(){string s("The expense of spirit\n\t");cout << s.size() << endl;return 0;}
:字符串是双引号

如果想判断string的size是否为0,可以使用empty:

int main(){        string s1("The expense of spirit\n\t");string s2;if (s2.empty())cout << "empty" << endl;cout << s1.size() << endl;return 0;}

empty()成员函数将返回bool值,如果string对象为空则返回true,继续执行;否则返回false,跳出。

2.string::size_type类型

size操作返回的是string::size_type类型的值,它定义为与unsigned型具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。

注解:任何存储string的size操作结果的变量必须为string::size_type类型。特别重要的是,不要把size的返回值赋给一个int变量。

3.string关系操作符

比较两个string值的大小,实际上是比较每个string对象的字符。

大写字母位于小写字母之前,任何一个大写字母都小于任意的小写字母。

==操作符:两个string对象相等是指它们的长度相同,且含有相同的字符。

1)如果两个string对象长度不同,且短的string对象与长的string对象的前面部分相匹配,则短的string对象小于长的string对象

2)如果两个string对象的字符不同,则比较第一个不匹配的字符。

5.两个string对象相加

strign对象的加法被定义为连接。

·6.和字符串字面值的连接。

string s1("hello");strign s2("world");string s3 = s1 + "," + s2 + "\n";

当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型,下面是不正确的写法:

string s = "hello" + "sdfd";

7.从string对象获取字符

string类型通过下标操作符([])来访问string对象的单个字符。下标操作符需要取一个size_type类型的值。string对象的下标从0开始。

可用下标操作符分别取出string对象的每个字符,分行输出:

#include <iostream>#include <string>using namespace std;int main(){        string str("some string");for (string::size_type ix = 0; ix != str.size(); ++ix)cout << str[ix] << endl;return 0;}

3.3 标准库vector类型

vector是同一类型的对象的集合,每个对象都有一个对应的整数索引值。一个容器中的所有对象都必须是同一种类型的。

使用vector之前,必须包含相应的头文件:#include <vector>

说明vector保存何种对象的类型,通过将类型放在类模板名称后面的尖括号中来指定类型:

vector<int> ivec;vectoe<Sales_item> Sales_vec;

定义vector对象要指定类型和一个变量的列表。上面第一个定义,类型是vector<int>,该类型是含有若干int类型对象的vector,变量名为ivec。

3.3.1 vector对象的定义和初始化

1.创建确定个数的元素

若要创建非空的vector对象,必须给出初始化元素的值,可以用元素个数和元素值对vector对象进行初始化,构造函数用元素个数决定vector对象保存的个数,元素值

指定每个元素的初始值:

vector<int> ivec4(10, -1);vector<string> svec(10, "hi!");

第一个定义:容器中一共有10个元素,每个元素都是-1;第二个定义:容器一共有10的元素,每个元素都是字符串"hi"

3.3.2 vector对象的操作

1.vector对象的size

vector<int>::size_type

2.向vector添加元素

push_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面。

string word;vector<string> text;while (cin >> word) {text.push_back(word);}
3.vector的下标操作

vector元素的位置从0开始

for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)

注解;C++程序员习惯优先选用!=而不是<来编写循环判断条件。

4.下标操作不添加元素

先给出错误的写法:

for (vector<int>::size_type ix = 0; ix != 10; ++ix)ivec[ix] = ix;
这里的ivec是空的vector对象,而且下标只能用于获取已存在的元素,

正确写法应该是:

for (vector<int>::size_type ix = 0; ix != 10; ++ix)ivec.push_back(ix);

3.4 迭代器简介

迭代器是一种检查容器内元素并遍历元素的数据类型,C++程序更倾向于使用迭代器而不是下标操作访问容器元素。

1.容器的iterator类型

vector<int>::iterator iter;

2.begin和end操作

如果容器中有元素的话,由begin返回的迭代器指向第一个元素:

vector<int>::iterator iter = ivec.begin();


由end操作符返回的迭代器指向vector的“末端元素的下一个”,通常称为超出末端迭代器,表明它指向了一个不存在的元素。

3.vector解引用运算

使用解引用操作符(*操作符)来访问迭代器所指向的元素。

*iter = 0;
5.迭代器应用的程序示例

for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)*iter = 0;
所有元素赋值为0.

6.const_iterator

只能读取容器内元素,但不能改变其值。

原创粉丝点击