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

c++primer(第五版) 第十章 泛型算法习题答案

2016-03-05 12:41 495 查看
第五版第九章以后的参考答案在网上很难找,于是就决定自己认真写一份,当做练习吧.

部分答案参考了github上大牛的代码.

10.1,    10.2

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <list>
using namespace std;
int main()
{
vector<int>v{1,2,3,4,5,6,7,8,9};
cout<<count(v.cbegin(), v.cend(),6)<<endl;

list<string>l{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};
cout<< count(l.cbegin(), l.cend(),"the")<<endl;
return 0;
}


10.3  10.4  10.5

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
int main()
{
vector<int>v {1,2,3,4,5,6,7,8,9};
cout<< accumulate(v.cbegin(), v.cend(),0)<<endl;

vector<double>v_d {1.1,2.2,3,14,5.1};
cout<< accumulate(v_d.cbegin(), v_d.cend(),0)<< endl;     //错误  初始累加和值为0(整型)  累加过程中会被强制转换为整型
cout<< accumulate(v_d.cbegin(), v_d.cend(),0.0)<< endl;
return 0;

//    10.5
//    结果为false
//    c风格字符串equal要满足是同一块内存中的那一条字符串
}


10.6 10.7 10.8

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
fill_n(vec.begin(), vec.size(), 0);
for (auto i : vec)
cout << i << " ";
cout << endl;

//    10.7
//    (a)
//    copy的第三个参数应该是一个插入迭代器
//    (b)
//    reserve是分配内存空间 并没有分配元素 应该使用resize

//    10.8
//    并不是标准库算法改变了容器大小 而是迭代器调用容器操作改变了容器大小
}


10.9  10.10

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

void elimDups(vector<string>& vec){
for(auto i:vec)
cout<<i<<" ";
cout<<endl;
sort(vec.begin(),vec.end());
for(auto i:vec)
cout<<i<<" ";
cout<<endl;
vector<string>::iterator it=unique(vec.begin(),vec.end());
for(auto i:vec)
cout<<i<<" ";
cout<<endl;
vec.erase(it,vec.end());
for(auto i:vec)
cout<<i<<" ";
cout<<endl;
}

int main(){
vector<string>vec{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};
elimDups(vec);
return 0;
}

//    10.10
//    @pezy: Cause the library algorithms operate on iterators, not containers. Thus, an algorithm cannot (directly) add or remove elements.
//    标准库算法都是针对迭代器的操作,而不是容器,因此,它不能直接添加或删除元素.


10.11     10.13

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

bool isShorter(const string&s1,const string& s2){
return s1.size()<s2.size();
}

bool part(const string& str1){
return str1.size()>=5?true:false;
}

void elimDups(vector<string>& vec){
sort(vec.begin(),vec.end());

vector<string>::iterator it=unique(vec.begin(),vec.end());

vec.erase(it,vec.end());

}

int main(){
//    10.11
vector<string>vec{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};
elimDups(vec);
stable_sort(vec.begin(),vec.end(),isShorter);
for(auto i:vec)
cout<<i<<" ";
cout<<endl;

//    10.13
vector<string>vec2{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};
partition(vec2.begin(),vec2.end(),part);
for(auto i:vec2)
cout<<i<<" ";
cout<<endl;
return 0;
}


10.14  10.15   10.17  10.18

#include<iostream>
#include<vector>
#include<algorithm>
#include"Sales_data.h"
using namespace std;

void elimdups(vector<string>& vs)
{
sort(vs.begin(), vs.end());
auto new_end = unique(vs.begin(), vs.end());
vs.erase(new_end, vs.end());
}

void biggies_partition(vector<string>& vs, int sz)
{
elimdups(vs);

auto pivot = partition(vs.begin(), vs.end(), [sz](const string& s) {return s.size() >= sz;});

for (auto it = vs.cbegin(); it != pivot; ++it) cout << *it << " ";
}

void biggies_stable_partition(vector<string>& vs, int sz)
{
elimdups(vs);

auto pivot =stable_partition(vs.begin(), vs.end(),[sz](const string& s) { return s.size() >= sz; });

for (auto it = vs.cbegin(); it != pivot; ++it) cout << *it << " ";
}

int main(){
// 10.14
auto func=[](int a,int b)->int{return a+b;};

// 10.15
int a=5;
auto func2=[a](int b)->int{return a+b;};

// 10.17
Sales_data d1("aa"), d2("aaaa"), d3("aaa"), d4("z"), d5("aaaaz");
vector<Sales_data> v{d1, d2, d3, d4, d5};
sort(v.begin(), v.end(),[](const Sales_data& sd1, const Sales_data& sd2)
{return sd1.isbn().size() < sd2.isbn().size();});
for (const auto& element : v) cout << element.isbn() << " ";
cout << endl;

// 10.18
vector<string>vec{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};
biggies_partition(vec,5);
for(auto i:vec)
cout<<i<<" ";
cout<<endl;

// 10.19
vector<string>vec2{"the","quick","red","fox","jumps","over","the","slow","red","turtle"};
biggies_stable_partition(vec2,5);
for(auto i:vec2)
cout<<i<<" ";
cout<<endl;
return 0;
}


10.20   10.21

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
//    10.20
vector<string>vec{"the","quick","red","fox","jumps","over","the","slow","red","turtle","ssssssss","ssssssaas"};
cout<<count_if(vec.cbegin(),vec.cend(),[](const string& str1){return str1.size()>6;})<<endl;

//    10.21
int s=6;
int d=3;
auto f1=[&]()->int{
if(d<1)
return 0;
else
return --d;};
while(s--)
std::cout<<f1()<<" ";
return 0;
}


10.22   10.23   10.24   10.25

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
using namespace std::placeholders;
bool check_size2(const string& str1,int sz){
return str1.size()<=sz;
}

void elimdups(std::vector<std::string>& vs)
{
std::sort(vs.begin(), vs.end());
auto new_end = std::unique(vs.begin(), vs.end());
vs.erase(new_end, vs.end());
}

bool check_size(const std::string& str,size_t sz){
return str.size()>=sz;
}

void biggies(std::vector<std::string>& vs, std::size_t sz)
{
using std::string;
elimdups(vs);
auto wc = std::stable_partition(vs.begin(), vs.end(),bind(check_size,_1,sz));
std::for_each(vs.begin(),wc, [](const string& s) { std::cout << s << " "; });
}

int main(){
//    10.22
vector<string>vec{"the","quick","red","fox","aaaaaaa","jumps","over","bbbbbbbb","the","slow","red","turtle"};
auto it=partition(vec.begin(),vec.end(),bind(check_size2,_1,6));
for(auto i=vec.begin();i!=it;i++)
cout<<*i<<" ";
cout<<endl;

//    10.23
//    原函数有n个参数 则bind后有n+1个参数 第n+1个参数为原函数名

//    10.24
vector<int>vec2{1,2,3,4,5,6,7,8,9,10};
string str="sssss";
auto it2=partition(vec2.begin(),vec2.end(),bind(check_size,str,_1));
cout<<*it2<<endl;

//    10.25
std::vector<std::string> v{"1234", "1234", "1234", "hi~",
"alan", "alan", "cp"};
biggies(v, 3);
cout <<endl;
return 0;

}


10.27  10.28

#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
using namespace std;
int main()
{
vector<int>v{1,2,3,4,5,6,7,8,9};

// 10.27
list<int>lst;
unique_copy(v.begin(),v.end(),front_inserter(lst));
for(auto i:lst)
cout<<i<<" ";
cout<<endl;

// 10.28
list<int>v2(20),v3(20),v4(20);
copy(v.begin(),v.end(),front_inserter(v2));
copy(v.begin(),v.end(),back_inserter(v3));
copy(v.begin(),v.end(),inserter(v4,v4.begin()));
for(auto i:v2)
cout<<i<<" ";
cout<<endl;
for(auto i:v3)
cout<<i<<" ";
cout<<endl;
for(auto i:v4)
cout<<i<<" ";
cout<<endl;
return 0;
}


10.29   10.30   10.31    10.32    10.33

#include<iostream>
#include<cstring>
#include<iterator>
#include<vector>
#include<algorithm>
#include<fstream>
#include"Sales_item"
using namespace std;

void func(ifstream& in,const string& odd,const string& even)
{
ofstream f1(odd),f2(even);
ostream_iterator<int>os1(f1," "),os2(f2," ");
int temp;
while(in>>temp){
if(temp%2)
*os1++=temp;
else
*os2++=temp;
}
}

int main()
{

// 10.29
ifstream in("in.txt");
istream_iterator<string>start(in),eof;
vector<string>vec;
while(start!=eof)
cout<<*start++<<" ";

// 10.30
vector<int>vec2;
istream_iterator<int>start2(cin),eof2;
copy(start2,eof2,back_inserter(vec));
sort(vec2.begin(),vec2.end());
copy(vec2.cbegin(),vec2.cend(),ostream_iterator<int>(cout," "));

// 10.31
vector<int>vec3;
istream_iterator<int>start3(cin),eof3;
unique_copy(start3,eof3,back_inserter(vec2));
sort(vec3.begin(),vec3.end());
copy(vec3.cbegin(),vec3.cend(),ostream_iterator<int>(cout," "));

// 10.32
istream_iterator<Sales_item> in_iter(cin), in_eof;
vector<Sales_item> vec4;

while (in_iter != in_eof) vec.push_back(*in_iter++);
sort(vec4.begin(), vec4.end(),
[](Sales_item const& lhs, Sales_item const& rhs) {
return lhs.isbn() < rhs.isbn();
});
for (auto beg = vec4.cbegin(), end = beg; beg != vec4.cend(); beg = end) {
end = find_if(beg, vec4.cend(), [beg](const Sales_item& item) {
return item.isbn() != beg->isbn();
});
cout << accumulate(beg, end, Sales_item(beg->isbn()))<< endl;
}

// 10.33
ifstream is("in2.txt");
func(is,"f1.txt","f2.txt");
return 0;
}


10.34   10.35  10.36  10.37

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

int main()
{
// 10.34
list<int> v{1,2,3,0,4,5,6,7,8,9};
for(auto i=v.crbegin();i!=v.crend();i++)
cout<<*i<<" ";
cout<<endl;

// 10.35
auto i=--v.end();
while(i!=v.begin())
cout<<*i--<<" ";
cout<<*i<<endl;

// 10.36
auto ans=find(v.crbegin(),v.crend(),0);
auto loc=ans.base();
cout<<*loc<<endl;

// 10.37
vector<int>v2{1,2,3,4,5,6,7,8,9};
list<int>l;
copy(v2.crbegin()+2,v2.crbegin()+7,back_inserter(l));
for(auto i:l)
cout<<i<<" ";
return 0;
}


10.39  10.40#include <iostream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;

int main()
{
// 10.39
// list: 双向迭代器
// vector: 随机访问迭代器

// 10.40
// copy: 第一,二个参数为输入迭代器 第三个为输出迭代器
// reverse:双向访问迭代器
// unique:前向迭代器
return 0;
}


10.41

#include <iostream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
// 10.41
replace(beg, end, old_val, new_val); // 在迭代器beg 和end 范围内 将old_val 替换成 new_val
replace_if(beg, end, pred, new_val); // 在迭代器beg 和end 范围内 将满足条件的pred的值替换成 new_val
replace_copy(beg, end, dest, old_val, new_val); // 将迭代器beg 和end 范围内的值拷贝到dest指向的容器中 并且在新容器中old_val 替换成了 new_val
replace_copy_if(beg, end, dest, pred, new_val); // 将迭代器beg 和end 范围内的值拷贝到dest指向的容器中 并且在新容器中满足条件的pred的值 替换成了 new_val
return 0;
}


10.42
#include<iostream>
#include<algorithm>
#include<list>
#include<string>
using namespace std;
int main()
{
list<string>lst{"aaa","bbb","ccc","aaa","bb","bbbb","cc","ccc"};
lst.sort();
lst.unique();
for(auto i:lst)
cout<<i<<" ";
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: