《C++ primer》--第9章

时间:2022-04-22
本文章向大家介绍《C++ primer》--第9章,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 习题9.2 创建和初始化一个vector对象有4种方式,为每种方式提供一个例子。

解答:

  1. 分配指定数目的元素,并对这些元素进行值初始化:
  • vector<int> ivec(10);     // ivec包含10个0值元素

      2.  分配指定数目的元素,并将这些元素初始化为指定值:

  • vector<int>  ivec(10 , 1);  // ivec包含10个值为1的元素

      3.  将vector对戏那个初始化为一段元素的副本:

  • int ia[10] = {0 , 1 ,2 ,3 ,4,5,6,7,8,9};
  • vector<int> ivec(ia , ia+10);  //ivec包含10个元素,值分别为0~9

     4.   将一个vector对象初始化为另一vector对象的副本:

  • vector<int>  ivec1(10 , 1);
  • vector<int>  ivec2(ivec1);    //  ivec2包含10个值为1的元素(与ivec1相同)

习题9.3  解释复制容器对象的构造函数和使用迭代器的构造函数之间的区别。

解答:

差别在于:

  • 复制容器对象的构造函数只能将一个容器初始化为另一容器的副本(即复制另一容器的全部元素),这种构造函数要求两个容器是同类型的;
  • 使用两个迭代器的构造函数可以将一个容器初始化为另一容器的子序列(即复制另一容器的一个子序列),而且采用这种构造函数不要求两个容器是同类型的。

习题9.9 编写一个循环将list容器的元素逆序输出。

实现代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

#include<iostream> #include<list> using namespace std;   int main() {     int ia[5]={1 , 2 , 3 , 4 , 5};     list<int> lst1(ia , ia + 5);     list<int>::iterator iter1 = lst1.begin(),         iter2 = lst1.end();       while(iter2 != iter1)         cout<<*(--iter2)<<" " ;     cout<<endl;       return 0; }

 习题9.12 编写一个函数,其形参是一对迭代器和一个int型数值,实现在迭代器标记的范围内寻找该int型数值的功能,并返回一个bool结果,以指明是否找到指定数据。

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

bool findInt(vector<int>::iterator beg , vector<int>::iterator end , int ival)
{
	while(beg != end)
		if(*beg == ival)
			break;
		else
			++beg;
		if(beg != end)
			return true;
		else
			return false;
}

int main()
{
	int a[5] = {10 , 13 , 5 , 8};
	vector<int> iter(a , a + 5);

    if(findInt( iter.begin() ,  iter.end() , 5))
	{
		cout<<"success !"<<endl;
	}
	else
		cout<<"failure!"<<endl;

	return 0;
}

习题9.11  要标记出有效的迭代器范围,迭代器需满足什么约束?

  如果迭代器first和last标记出有效的迭代器范围,则必须满足:

  • first和last指向同一个容器中的元素或超出末端的下一个位置;
  • 如果first和last不相等,则对first反复做自增运算必须能够到达last;
  • 即在容器中last不能位于first之前。

习题9.20 编写程序判断一个vector<int>容器所包含的元素是否与一个list<int>容器的完全相同。

//判断一个vector<int>容器所包含的元素
//是否与一个list<int>容器的完全相同
#include<iostream>
#include<vector>
#include<list>
using namespace std;

int main()
{
	vector<int> ivec;
	list<int> ilst;
	int ival;

	//读入int对象并存储在vector对象中
	cout<<"Enter some integers for vector(Ctrl+z to end): "
		<<endl;
	while(cin>>ival)
		ivec.push_back(ival);

	cin.clear();  //使流对象重新置为有效状态

	//读入int对象并存储在list对象中
	cout<<"Enter some integers for list: "
		<<endl;
	while(cin>>ival)
		ilst.push_back(ival);

	//比较vector对象和list对象中的对应元素
	vector<int>::iterator vit = ivec.begin();
	list<int>::iterator lit = ilst.begin();
	while(vit != ivec.end() && lit != ilst.end())
	{
		if(*vit != *lit) //对应元素不相等则结束循环
			break;
		++vit;
		++lit;		
	}
	//输出比较结果
	if(vit == ivec.end() && lit == ilst.end())  //所有元素都相等
		cout<<"The vector contains the same elements as the list."
		    <<endl;
	else
		cout<<"List and vector contain different elements."
		    <<endl;

	return 0;
	
}

 注意,因为使用文件结束符作为输入vector元素的结束,所以,读入了所有的vector元素后,流cin处于无效状态,需要将流cin重新置为有效,否则,将无法使用cin继续读入list元素。