习题答案(21~30)

Posted MISAYAONE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题答案(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:因为是单参数版本,所以必须提供默认构造函数




开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于习题答案(21~30)的主要内容,如果未能解决你的问题,请参考以下文章

习题:Maximize! (贪心)

《网络编程与协议分析》复习题答案

概率论与数理统计 习题题目及答案(总)

计算机操作系统实验指导 (第3版) 第四篇 操作系统学习指导和习题解析 第21章:虚拟存储管理 习题和答案

习题二 答案

查找--练习题