C++标准库类型(转)

来源:互联网 发布:淘宝卖家违规扣分 编辑:程序博客网 时间:2024/06/07 00:11

标准库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数据类型的使用。

可以使用iostreamstring标准库,使用标准输入输出操作符来读写string对象。

String类型的输入操作符(>>):

1. 读取并忽略开头所有的空白字符。

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

输入和输出操作的行为与内置类型操作符基本类似,尤其是,这些操作符返回左操作数作为运算结果,因此,我们可以把多个读操作或多个写操作放在一起:

String s1, s2;

Cin >> s1 >> s2;

Cout << s1 << s2;

1. 读入未知数目的string对象

String word;

While(cin >> word)

Cout << word << endl;

String的输入操作符也会返回所读的数据流。因此,可以把输入操作符作为判断条件。用输入操作符来读取string对象,该操作符返回所读的istream对象,并在读取结束后,作为while判断条件。如果输入流是有效的,即还未到达文件尾且未遇到无效输入,则执行while循环体,并将读取到的字符串输出到标准输出,如果未到达文件尾,则跳出while循环。

2. getline读取整行文本

Getline:这个函数接受两个参数,一个输入流对象和一个string对象,getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。和输入操作符不一样的是,getline并不忽略开头的换行符,只要getline遇到换行符,即便它是第一个字符,getline也将停止读入并返回,如果第一个字符就是换行符,则string参数被置为空string

Getline函数将istream参数作为返回值,和输入操作符一样也把它用作判断条件。

String line;

While(getline(cin, line))

Cout << line << endl;

由于line不含换行符,若要逐行输出需要自行添加,我们用endl来输出一个换行符并刷新输出缓冲区。由于getline函数返回时丢弃换行符,换行符将不会存储在string对象中。

3. String对象操作

s.empty():如果s为空串,则返回true,否则返回false

s.size():返回s中字符的个数。

s[n]:返回s中位置为n的字符,位置从0开始计数。

s1 + s2:把s1s2连接成一个新字符串,返回新生成的字符串。

s1 = s2:把s1的内容替换为s2的副本。

v1 == v2:比较v1v2的内容,相等则返回true,否则返回false

!=,<,<=,>>=:保持这些操作符惯有的含义。

4. String::stize_type类型:string类类型和许多其他库类型都定义了一些配套类型,通 过这些配套类型,库类型的使用就能与机器无关。Size_type类型就是这些配套类型中的一个。它定义了与unsigned型具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为了使用由string类型定义的size_type类型,程序员必须加上作用域操作符来说明所使用的size_type类型是由string类定义的。最佳实践:任何存储stringsize操作结果的变量必须为string::size_type类型。特别重要的是,不要把size的返回值赋给一个int变量。

5. String关系操作符:string对象比较操作是区分大小写的,即同一个字符的大小写形式被认为是两个不同的字符,在多数计算机上(PC体系结构),大写的字母位于小写字母之前,所以任何一个大写字母都小于任意的小写字母。关系操作符比较两个string对象时采用了和字典排序相同的策略:1.如果两个string对象小于长的string对象。2.如果两个string对象的字符不同,则比较第一个不匹配的字符。

6. 当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型。两个字符串字面值(它们是常量)不能相加。注意操作符重载的返回类型。

7. String对象的下标从0开始,如果s是一个string对象且s不空,则s[0]就是字符串的第一个字符,s[1]就表示第二个字符,而s[s.size() - 1]则表示s的最后一个字符。下标操作符需要取一个size_type类型的值。String对象的索引变量最好也用string::size_type类型。必须保证索引值在上下界范围内。在上下界范围内就是指索引值是一个赋值为size_type类型的值,其取值范围在0string对象长度减1之间。

8. 字符处理:C++C之上重新构建了一些C的标准库函数。比如字符处理的函数在cctype头文件中。

 

Vector类型:

Vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的内存。把Vector称为容器,是因为它可以包含其他对象,一个容器中的所有对象都必须是同一种类型的。

#include

Using std::vector;

Vector是一个类模板,使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。因此,我们可以定义保存string对象的vector,或保存int值的vector,又或是保存自定义的类类型对象的vector

声明从类模板产生的某种类型的对象,需要提供附加信息,信息的种类取决于模板。通过将类型放在类模板名称后面的尖括号中来指定类型。Vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。Vector类型的每一种都指定了其保存元素的类型。因此,vectorvector都是数据类型。(模板是一种数据结构,通过它可定义用于其他类型的数据结构)

1. vector对象的定义和初始化

vector v1; vector保存类型为T的对象。默认构造函数v1为空。

vector v2(v1); v2v1的一个副本。

vector v3(n, i); v3包含n个值为i的元素。

Vector v4(n); v4含有值初始化的元素的n个副本。

2. Vector对象动态增长:vector对象(以及其他标准库容器对象)的重要属性就在于可以在陨星时高效地添加元素。

3. 值初始化:如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化。如果vector保存内置类型的元素,那么标准库将用0值创建元素的初始化式。如果vector保存的是含有构造函数的类类型的元素,标准库将用该类类型的默认构造函数创建元素初始化式(使用默认构造函数加上attach的方式)。如果元素类型有自定义构造函数但没有默认构造函数的类,在初始化这种类型的vector对象时,程序员就不能仅提供元素个数,还需要提供元素初始值。

4. Vector对象的操作

v.empty():如果v为空,则返回true,否则返回false

v.size():返回v中元素的个数。

v.push_back(t):在v的末尾增加一个值为t的元素。

v[n]:返回v中位置为n的元素。

v1 = v2:把v1的元素替换为v2中元素的副本。

v1 == v2:如果v1v2相等,则返回true

!=<</SPAN><=>>=:保持这些操作符惯有的含义。

5. 使用size_type类型时,必须指出该类型是在哪里定义的。Vector类型总是包括vector类定义的size_type的值:vector::size_type

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

7. Vector中的对象是没有生命的,可以按vector中对象的位置来访问它们,通过使用下标操作符。(支持随机访问)

8. C++程序员习惯于优先选用!+而不是<</SPAN>来编写循环判断条件。

For(vector::size_type ix = 0; ix != ivec.size(); ix++)//在遍历的过程中,使用size()方法,因为考虑到有可能会在循环体中添加元素,虽然这样做不好

Ivec[ix] = 0;

9. 下标操作不添加元素:不能使用下标操作符来添加元素,下标操作符只能访问已存在的元素。试图获取不存在的元素必然产生运行时错误。不能确保执行过程可以捕捉到这类错误,运行程序的结果是不确定的。

 

迭代器:

迭代器是一种检查容器内元素并遍历元素的数据类型。标准库为每一种标准容器(包括vector)定义了一种迭代器类型,迭代器类型提供了比下标操作符操作更通用化的方法,所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。

1. 容器的iterator类型:

每种容器类型都定义了自己的迭代器类型:

vectorvector::iterator iter;(迭代器:支持一组确定的操作,这些操作可用来遍历容器内的元素,并访问这些元素的值)各容器类都定义了自己的iterator类型,用于访问容器内的元素,每个容器都定义了一个名为iterator的类型,而这种类型支持迭代器的各种操作。

2. Beginend操作

每个容器都定义了一对命名为beginend函数,用于返回迭代器。如果容器中有元素的话,由begin返回的迭代器指向第一个元素:vector::iterator iter = ivec.begin();end操作返回的迭代器指向了vector的末端元素的下一个,通常称为超出末断迭代器,表明它指向了一个不存在的元素。End操作返回的迭代器只是起一个哨兵的作用。

3. Vector迭代器的自增和解引用运算

迭代器类型定可使用解引用操作符(*操作符)来访问迭代起所指向的元素。迭代起使用自增操作符向后移动迭代器指向容器中下一个元素。(迭代器是在类型内部使用typedef定义的)

4. 迭代器的其他操作

可以使用比较操作符(==!=)来比较两个迭代器。

5. 迭代器用于访问元素,可以对元素进行任何修改。

6. const_iterator:每种容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器内元素,但不能改变其值。这种迭代器指向的对象的值是不能改变的,但迭代器指针能改变,比如执行++--

7. 任何改变vector长度的操作都会使已存在的迭代器失效。

0 0
原创粉丝点击