您的位置:首页 > 编程语言 > C语言/C++

C++Primer第五版 第十章习题答案(31~40)

2017-02-28 09:37 387 查看
31:知识点:unique_copy()去掉了重复元素

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<algorithm>
#include<numeric>
#include<functional>
#include<iterator>
using namespace std;
using namespace placeholders;//占位符的命名空间

int main(int argc, char**argv)
{
vector<int> vec1;
//创建流迭代器、尾后迭代器,最好是这样,放在一起,不然很可能类型不同就会报错
istream_iterator<int> str(cin), end;

// 	while (str != end)
// 	{
// 		vec1.push_back(*str++);
//
// 	}//此操作和copy一样的效果,只不过要记得++.
unique_copy(str,end,back_inserter(vec1));//存入vec1,unique_copy只会留下不重复元素

sort(vec1.begin(),vec1.end());//不能用cbegin(),我日

for (int i = 0; i < vec1.size(); ++i)
{
cout<<vec1[i]<<endl;
}

return 0;
}


32:没看到需要用到流迭代器的~

33:知识点:有一点需要注意的就是流迭代器不支持递减运算,因为不可能在流中反向移动

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<algorithm>
#include<numeric>
#include<functional>
#include<iterator>
using namespace std;
using namespace placeholders;//占位符的命名空间

int main(int argc, char**argv)
{
ifstream in(/*argv[1]*/"1.txt");//导入第一个参数,作为输入文件
istream_iterator<int> it1(in),end;//定义流迭代器,输入流,和输入流的尾迭代器

vector<int> vec1;//存储用vector
/*	copy(it1,end,back_inserter(vec1));//将流中数据存入vector*/
while (it1 != end)
{
vec1.push_back(*it1);
++it1;
}

ofstream out(/*argv[2]*/"2.txt");
ofstream out2(/*argv[3]*/"3.txt");//目标写文件
ostream_iterator<int> it2(out,"\n");//定义流迭代器,输出流,每行结尾换行
ostream_iterator<int> it3(out2,"\n");//定义流迭代器,输出流,每行结尾换行
for (int i = 0; i<vec1.size(); ++i)
{
if (vec1[i]%2 == 0)//偶数
{
it2++ = vec1[i];//偶数放在2.txt中
}
else
{
it3++ = vec1[i];//奇数放在3.txt中
}
}

return 0;
}


34:知识点1:反向迭代器,加上r,反向迭代器需要的是递减运算符,操作会从cbegin()反向处理string

知识点2:rbegin()指向的是最后一个元素,rend()指向的是首元素之前的位置

知识点3:通过调用反向迭代器的base()成员函数,可以将其转换为对应的普通迭代器

#include<vector>
#include<algorithm>
#include<numeric>
#include<functional>
#include<iterator>
using namespace std;
using namespace placeholders;//占位符的命名空间

int main(int argc, char**argv)
{
int a[5] = {1,2,3,4,5};
vector<int> day1(a,a+5);

for (auto it1 = day1.rbegin(); it1 != day1.rend() ; ++it1)//这里的++实际上是递减的
{
cout<<*it1<<" ";
}

return 0;
}

35:

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<algorithm>
#include<numeric>
#include<functional>
#include<iterator>
using namespace std;
using namespace placeholders;//占位符的命名空间

int main(int argc, char**argv)
{
int a[5] = {1,2,3,4,5};
vector<int> day1(a,a+5);

for (auto it1 = day1.end(); it1 != day1.begin() ;--it1)//普通迭代器的--是向后移动
{
cout<<*(it1-1)<<" ";
}

return 0;
}

36:

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<list>
#include<algorithm>
#include<numeric>
#include<functional>
#include<iterator>
using namespace std;
using namespace placeholders;//占位符的命名空间

int main(int argc, char**argv)
{
int a[5] = {1,0,3,0,4};
list<int> list1(a,a+5);

cout<< *find(list1.rbegin(),list1.rend(),0);

return 0;
}

37:知识点:反向迭代器++是递减的运算符,向后移动,--是递增的运算符,向前移动

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<list>
#include<algorithm>
#include<numeric>
#include<functional>
#include<iterator>
using namespace std;
using namespace placeholders;//占位符的命名空间

int main(int argc, char**argv)
{
int a[10] = {1,0,3,0,4,5,8,9,6,5};
vector<int> vec1(a,a+10);
list<int> list1;
//反向迭代器++是递减的运算符,向后移动,--是递增的运算符,向前移动
copy(vec1.rbegin()+3,vec1.rend()-2,back_inserter(list1));

for (auto it1 = list1.begin(); it1 != list1.end(); ++it1)
{
cout<<*it1<<" ";
}
return 0;
}

38:知识点1:5种迭代器类别,注重理解即可,主要就是是否可读写,是单边扫描还是多遍扫描,支持递减还是递增操作

知识点2:输入迭代器:可以读取序列中的元素。输出迭代器,看作是输入迭代器的补集,可写。前向迭代器:单向,支持输入输出。双向迭代器:双向,支持读写,还支持递增递减运算符。随机访问迭代器:基本支持所有功能。

39:list:双向迭代器。vector:随机访问迭代器

40:

copy的三个参数,第一二个数输入迭代器,第三个是输出迭代器

reverse肯定是需要双向迭代器的

unique是前向迭代器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息