天天看點

C++Primer第五版 第九章習題答案(21~30)

21:知識點:insert()函數傳回值是第一個新加入元素的疊代器,即指向新插入元素的疊代器~

此題中,雖然list換為vector但是具體的過程不會變。

22:知識點1:疊代器加上固定的數字指的是疊代器的增長,而不是數值的增長,此處加上iv.size()/2是正确的。

題目的意思應該是判斷前半部分的元素有無與某值相等的元素,如有則在其前插入一個兩倍的某值。

insert()操作有傳回值,此題為無限循環,且插入元素後,mid做為一個引用會失效。

iv.reserver(25); // 為vector預留白間,在後面的節中可以看到

vector<int>::iterator iter = iv.begin(), mid = iv.begin() + iv.size()/2;
while (iter != mid)
    if (*mid == some_val)
        mid = iv.insert(mid, 2 * some_val);
    else
        --mid;
           

23:知識點:end()指向的是最後一個元素的後一位置

是以四個值皆為:*c.begin(),即第一個元素

24:知識點1:at,下表運算符,front傳回的都是第一個元素的引用,而begin傳回的是第一個元素的疊代器

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
using namespace std;

int main(int argc, char**argv)
{
	vector<int> vec1;
	int a = vec1.front();//terminating with uncaught exception of type std::out_of_range
	int b = vec1[0];// Segmentation fault: 11
	int c = vec1.at(0);
	int d = *vec1.begin();//需要解引用
	cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
	
	return 0;
}
           

在空的vector上分别測試結果如上

25:知識點:容器(除array)有許多的删除元素的方法

pop_back()

pop_front()

erase()

clear()

相等:不發生删除操作

elem2為尾後疊代器:删除elem1到最後一個元素

皆為尾後疊代器:不發生删除操作

26:知識點:erase()操作傳回的是最後一個被删元素的後一個位置

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<list>
using namespace std;

int main(int argc, char**argv)
{
	int ia[] ={0,1,1,2,3,5,8,13,21,55,89};
	
	vector<int> vec1(ia,ia+9);//拷貝操作
	list<int> list1(ia,ia+9);

	vector<int>::iterator it1 = vec1.begin();//使用疊代器
	list<int>::iterator it2 = list1.begin();

	while (it1 != vec1.end())//删除操作
	{
		if ((*it1)%2 == 0)
		{
			it1 = vec1.erase(it1);//将删除位置更新
		}
		else//若判斷非偶數,則移到下一位置
		{
			++it1;
		}
	}

	while (it2 != list1.end())
	{
		if (*it2%2 != 0)
		{
			it2 = list1.erase(it2);//将删除位置更新
		}
		else//若判斷非偶數,則移到下一位置
		{
			++it2;
		}
	}
	
	//驗證結果
	vector<int>::iterator it3 = vec1.begin();//需要重新定義臨時疊代器
	list<int>::iterator it4 = list1.begin();
	for (it3;it3 != vec1.end(); ++it3)
	{
		cout<<*it3<<" ";
	}
	cout<<endl;
	for (it4;it4 != list1.end(); ++it4)
	{
		cout<<*it4<<" ";
	}
	
	return 0;
}
           

27:知識點1:forward_list的相關操作比較特殊,有其自己特殊的删除和插入操作

知識點2 :注意其删除操作時每個特殊操作的使用

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<forward_list>
using namespace std;

int main(int argc, char**argv)
{
	int ia[] ={0,1,1,2,3,5,8,13,21,55,89};
	
	forward_list<int> forward_list1(ia,ia+9);

	forward_list<int>::iterator it1 = forward_list1.begin();//第一個元素
	forward_list<int>::iterator it2 = forward_list1.before_begin();//首前元素

	while (it1 != forward_list1.end())//删除操作
	{
		if ((*it1)%2 == 1)
		{
			it1 = forward_list1.erase_after(it2);//特殊操作erase_after,删除的是疊代器參數之後的參數,傳回同erase()
		}
		else//若判斷非偶數,則移到下一位置
		{
			it2 = it1;//将首前元素的标記置為第一個元素
			++it1;
		}
	}
	
	//驗證結果
	forward_list<int>::iterator it4 = forward_list1.begin();
	for (it4;it4 != forward_list1.end(); ++it4)
	{
		cout<<*it4<<" ";
	}
	
	return 0;
}
           

28:

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<forward_list>
using namespace std;

void func(forward_list<string> &a, string b, string c)
{
	forward_list<string>::iterator it1 = a.before_begin();
	forward_list<string>::iterator it2 = a.begin();

	bool flag = false; 
	for (it2; it2 != a.end(); it1 = it2++)
	{
		if (*it2 == b)
		{
			a.insert_after(it2,c);
			flag = true;
		}
	}
	if (!flag)
	{
		a.insert_after(it1,c);
	}
}

int main(int argc, char**argv)
{
	forward_list<string> list1(4,"sadi");
	string a = "sad5";
	string b = "sad";

	func(list1,a,b);

	forward_list<string>::iterator it1 = list1.begin();
	for (it1; it1!=list1.end();++it1)
	{
		cout<<*it1<<" ";
	}
	return 0;
}

           

29:知識點:resize()改變容器的大小,多删少補并初始化,需要預設初始化的,則需要參數類型有預設構造函數。

resize(100)會将其大小改為100個元素的大小,添加新元素并初始化,之後使用resize(10)會将之後的90個元素舍棄。

30:因為是單參數版本,是以必須提供預設構造函數

繼續閱讀