标准库string类型:
String类型支持长度可变的字符串,C++标准将负责管理与存储字符相关的内存,以及提供各种有用的操作,标准库string类型的目的就是满足对字符串的一般应用。
提供合适的引用:
#include
Using std::string;
String对象的定义和初始化:
String标准库支持几个构造函数,构造函数是一个特殊成员函数,定义如何初始化该类型的对象,当没有明确指定对象初始化时,系统将使用默认构造函数。
String s1; 默认构造函数,s1为空串。
String s2(s1); 将s2初始化为s1的一个副本。
String s3(“value”); 将s3初始化为一个字符串字面值副本。
String s4(n, ‘c’); 将s4初始化为字符’c’的n个副本。
标准库string类型和字符串字面值:
字符串字面值与标准库string类型不是同一种类型,编程时一定要区分字符串字面值和string数据类型的使用。
可以使用iostream和string标准库,使用标准输入输出操作符来读写string对象。
String类型的输入操作符(>>):
1.
2.
输入和输出操作的行为与内置类型操作符基本类似,尤其是,这些操作符返回左操作数作为运算结果,因此,我们可以把多个读操作或多个写操作放在一起:
String s1, s2;
Cin >> s1 >> s2;
Cout << s1 << s2;
1.
String word;
While(cin >> word)
String的输入操作符也会返回所读的数据流。因此,可以把输入操作符作为判断条件。用输入操作符来读取string对象,该操作符返回所读的istream对象,并在读取结束后,作为while判断条件。如果输入流是有效的,即还未到达文件尾且未遇到无效输入,则执行while循环体,并将读取到的字符串输出到标准输出,如果未到达文件尾,则跳出while循环。
2.
Getline:这个函数接受两个参数,一个输入流对象和一个string对象,getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。和输入操作符不一样的是,getline并不忽略开头的换行符,只要getline遇到换行符,即便它是第一个字符,getline也将停止读入并返回,如果第一个字符就是换行符,则string参数被置为空string。
Getline函数将istream参数作为返回值,和输入操作符一样也把它用作判断条件。
String line;
While(getline(cin, line))
由于line不含换行符,若要逐行输出需要自行添加,我们用endl来输出一个换行符并刷新输出缓冲区。由于getline函数返回时丢弃换行符,换行符将不会存储在string对象中。
3.
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。
!=,<,<=,>和>=:保持这些操作符惯有的含义。
4.
5.
6.
7.
8.
Vector类型:
Vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的内存。把Vector称为容器,是因为它可以包含其他对象,一个容器中的所有对象都必须是同一种类型的。
#include
Using std::vector;
Vector是一个类模板,使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。因此,我们可以定义保存string对象的vector,或保存int值的vector,又或是保存自定义的类类型对象的vector。
声明从类模板产生的某种类型的对象,需要提供附加信息,信息的种类取决于模板。通过将类型放在类模板名称后面的尖括号中来指定类型。Vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。Vector类型的每一种都指定了其保存元素的类型。因此,vector和vector都是数据类型。(模板是一种数据结构,通过它可定义用于其他类型的数据结构)
1.
vector v1;
vector v2(v1);
vector v3(n, i);
Vector v4(n);
2.
3.
4.
v.empty():如果v为空,则返回true,否则返回false;
v.size():返回v中元素的个数。
v.push_back(t):在v的末尾增加一个值为t的元素。
v[n]:返回v中位置为n的元素。
v1 = v2:把v1的元素替换为v2中元素的副本。
v1 == v2:如果v1与v2相等,则返回true。
!=,<</SPAN>,<=,>,>=:保持这些操作符惯有的含义。
5.
6.
7.
8.
For(vector::size_type ix = 0; ix != ivec.size(); ix++)//在遍历的过程中,使用size()方法,因为考虑到有可能会在循环体中添加元素,虽然这样做不好
9.
迭代器:
迭代器是一种检查容器内元素并遍历元素的数据类型。标准库为每一种标准容器(包括vector)定义了一种迭代器类型,迭代器类型提供了比下标操作符操作更通用化的方法,所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。
1.
每种容器类型都定义了自己的迭代器类型:
如vector:vector::iterator iter;(迭代器:支持一组确定的操作,这些操作可用来遍历容器内的元素,并访问这些元素的值)各容器类都定义了自己的iterator类型,用于访问容器内的元素,每个容器都定义了一个名为iterator的类型,而这种类型支持迭代器的各种操作。
2.
每个容器都定义了一对命名为begin和end函数,用于返回迭代器。如果容器中有元素的话,由begin返回的迭代器指向第一个元素:vector::iterator iter = ivec.begin();由end操作返回的迭代器指向了vector的末端元素的下一个,通常称为超出末断迭代器,表明它指向了一个不存在的元素。End操作返回的迭代器只是起一个哨兵的作用。
3.
迭代器类型定可使用解引用操作符(*操作符)来访问迭代起所指向的元素。迭代起使用自增操作符向后移动迭代器指向容器中下一个元素。(迭代器是在类型内部使用typedef定义的)
4.
可以使用比较操作符(==和!=)来比较两个迭代器。
5.
6.
7.