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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值