【C++ Primer学习笔记】第3章:标准库类型

除第2章介绍的基本数据类型外,C++还定义了一个内容丰富的抽象数据类型标准库。


3.1命名空间的using声明

在编译我们提供的实例程序前,读者一定要注意在程序中添加适当的#include和using说明。

有一种情况下,必须总是使用完全限定的标准库名字:在头文件中


3.2标准库string类型

编程时一定要注意区分字符串字面值和string数据类型的使用。

string类型输入:读取并忽略开头所有空白字符,直至再次遇到空白字符读取终止。

getline:接受两个参数,一个输入流对象和一个string对象,从输入流下一行读取,遇到换行符终止并丢弃换行符。

任何存储string的size操作结果的变量必须为string::size_type类型。不要把size返回值赋给int变量。

为避免溢出,保存一个string对象size最安全的方法是使用标准库类型string::size_type。

当进行string对象和字符串字面值混合连接时,+操作符的左右操作数必须至少一个是string类型。

下标操作符需要取一个size_type类型的值,来标明要访问字符的位置。

C++程序员应采用cname这种头文件版本,而不是name.h版本,这样标准库中的名字在命名空间std中保持一致。使用.h版本会给程序员带来负担,因为他们必须记得哪些标准库名字是从C继承过来的,哪些是C++所特有的。


3.3标准库vector类型

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

定义vector对象要指定类型和一个变量的列表。

虽然可以对给定元素个数的vector对象预先分配内存,但是更有效的方法是先初始化一个空的vector对象,然后再动态的增加元素。

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

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


3.4迭代器简介

迭代器是一种检查容器内元素并遍历元素的数据类型。

每个标准容器类型都定义了一个名为iterator的成员,这里的iterator与迭代器实际类型的含义相同,这种类型支持迭代器的各种操作。

end操作返回的迭代器不指向任何元素。

不要把const_iterator对象和const的iterator对象混淆。

迭代器加上或者减去的值应该是vector的size_type或者difference_type类型。


3.5标准库bitset类型

定义bitset时,要明确bieset含有多少位,须在尖括号中给出它的长度值。

string对象的最右面字符用来初始化bitset对象低阶位。

count操作的返回类型是标准库中命名为size_t的类型。size_t定义在cstddef头文件中。

相对于C++内置数据的数组和指针而言,程序员应优先使用标准库类类型。


习题3.5 从标准输入每次读入一行文本

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


习题3.8 从标准输入读入多个string对象并连接起来,连接后对象以空格隔开

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string sumstr,str;
	cout<<"Enter strings(Ctrl+Z to end):"<<endl;
	while(cin>>str)
	  sumstr=sumstr+' '+str;
    cout<<"string equal to the concatenation of these strings is:"
        <<endl<<sumstr<<endl;
    return 0;
}


习题3.10

#include<iostream>
#include<string>
#include<cctype>
using namespace std;

int main()
{
	string str,xstr;
	bool has_punct=false;
	char ch;
	
	cout<<"Enter a string:"<<endl;
	getline(cin,str);
	for(string::size_type index=0;index!=str.size();index++)
	{
		ch=str[index];
		if(ispunct(ch))
		  has_punct=true;
        else xstr+=ch;
	}
	if(has_punct)
	  cout<<"result:"<<endl<<xstr<<endl;
	else {cout<<"No pounctuation character in the string?!"<<endl;
	     return -1; 
	}
	return 0;
}




习题3.14

#include<iostream>
#include<string>
#include<vector>
#include<cctype>
using namespace std;

int main()
{
	vector<string> svec;
	string str;
	
	cout<<"Enter text(Ctrl+Z to end):"<<endl;
	while(cin>>str)
	  svec.push_back(str);
	  
    cout<<"Transformed elements from the vector:"<<endl;
    for(vector<string>::size_type ix=0;ix!=svec.size();++ix)
    {
    	for(string::size_type index=0;index!=svec[ix].size();++index)
    	  if(islower(svec[ix][index]))
    	  svec[ix][index]=toupper(svec[ix][index]);
  	    cout<<svec[ix]<<" ";
  	    if((ix+1)%8==0)cout<<endl;
    }
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值