c++primer(第五版) 第十章 泛型算法习题答案
2016-03-05 12:41
495 查看
第五版第九章以后的参考答案在网上很难找,于是就决定自己认真写一份,当做练习吧.
部分答案参考了github上大牛的代码.
10.1, 10.2
10.3 10.4 10.5
10.6 10.7 10.8
10.9 10.10
10.11 10.13
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
10.22 10.23 10.24 10.25
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;
}
部分答案参考了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;
}
相关文章推荐
- 【总结】逆置双向链表的三种方法
- 重拾c语言——指针与数组
- POJ1190
- C语言解释器的实现--序(零)
- C++ 17 的最新动态
- C++容器详解
- C语言调用动态库中的函数的方法(dlopen,dlsym等)
- c语言概述
- vs2013 c++項目轉 vs2008
- C/C++ 声卡编程代码
- C++类的静态成员(static members in classes)
- C++拷贝构造函数
- 堆排序的c++实现代码
- C++中值传递、指针传递、引用传递
- C++学习笔记:异常的基本语法
- C语言易错的优先级
- 比较大数的大小(10**6) c++ python
- 双向链表(c++实现)
- /c++赋值运算符为什么要返回引用
- 条款二:最好使用c++转型操作符