C++ Primer第五版_第十章习题答案(11~20)

文章目录

      • 练习10.11
      • 练习10.12
      • 练习10.13
      • 练习10.14
      • 练习10.15
      • 练习10.16
      • 练习10.17
      • 练习10.18
      • 练习10.19
      • 练习10.20

练习10.11

编写程序,使用 stable_sort 和 isShorter 将传递给你的 elimDups 版本的 vector 排序。打印 vector的内容,验证你的程序的正确性。

#include 
#include 
#include 
#include 
#include 
#include 

template
inline std::ostream& println(Sequence const& seq)
{
	for (auto const& elem : seq) std::cout << elem << " ";
	std::cout << std::endl;

	return std::cout;
}

inline bool
is_shorter(std::string const& lhs, std::string const& rhs)
{
	return lhs.size() < rhs.size();
}


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


int main()
{
	std::vector v{
	"1234", "1234", "1234", "Hi", "alan", "wang"
};
	elimdups(v);
	std::stable_sort(v.begin(), v.end(), is_shorter);
	std::cout << "ex10.11 :\n";
	println(v);

	return 0;
}

练习10.12

编写名为 compareIsbn 的函数,比较两个 Sales_data 对象的isbn() 成员。使用这个函数排序一个保存 Sales_data 对象的 vector。

#include 
#include 
#include 
#include 
#include 
#include "exercise7_26.h"    

inline bool compareIsbn(const Sales_data &sd1, const Sales_data &sd2)
{
	return sd1.isbn().size() < sd2.isbn().size();
}

int main()
{
	Sales_data d1("aa"), d2("aaaa"), d3("aaa"), d4("z"), d5("aaaaz");
	std::vector v{ d1, d2, d3, d4, d5 };

	std::sort(v.begin(), v.end(), compareIsbn);

	for (const auto &element : v)
		std::cout << element.isbn() << " ";
	std::cout << std::endl;

	return 0;
}

练习10.13

标准库定义了名为 partition 的算法,它接受一个谓词,对容器内容进行划分,使得谓词为true 的值会排在容器的前半部分,而使得谓词为 false 的值会排在后半部分。算法返回一个迭代器,指向最后一个使谓词为 true 的元素之后的位置。编写函数,接受一个 string,返回一个 bool 值,指出 string 是否有5个或更多字符。使用此函数划分 words。打印出长度大于等于5的元素。

#include 
#include 
#include 
#include 

bool predicate(const std::string &s)
{
	return s.size() >= 5;
}

int main()
{
	auto v = std::vector{ "a", "as", "aasss", "aaaaassaa", "aaaaaabba", "aaa" };
	auto pivot = std::partition(v.begin(), v.end(), predicate);

	for (auto it = v.cbegin(); it != pivot; ++it)
		std::cout << *it << " ";
	std::cout << std::endl;

	return 0;
}

练习10.14

编写一个 lambda ,接受两个int,返回它们的和。

auto f = [](int i, int j) { return i + j; };

练习10.15

编写一个 lambda ,捕获它所在函数的 int,并接受一个 int参数。lambda 应该返回捕获的 int 和 int 参数的和。

int x = 10;
auto f = [x](int i) { i + x; };

练习10.16

使用 lambda 编写你自己版本的 biggies。

#include 
#include 
#include 
#include 

using namespace std;

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

void biggies(std::vector &vs, std::size_t sz)
{

	elimdups(vs);

	std::stable_sort(vs.begin(), vs.end(), 
		[](string const& lhs, string const& rhs) {
		return lhs.size() < rhs.size(); }
	);

	auto wc = std::find_if(vs.begin(), vs.end(), 
		[sz](string const& s) { return s.size() >= sz; }
	);

	std::for_each(wc, vs.end(),
		[](const string &s) {
		std::cout << s << " "; }
	);
}

int main()
{
	std::vector v
	{
	"1234", "1234", "1234", "hi~", "alan", "alan", "cp"
};
	std::cout << "ex10.16: ";
	biggies(v, 3);
	std::cout << std::endl;

	return 0;
}

练习10.17

重写10.3.1节练习10.12的程序,在对sort的调用中使用 lambda 来代替函数 compareIsbn。

#include 
#include 
#include 
#include 
#include "exercise7_26.h"     

int main()
{
	Sales_data d1("aa"), d2("aaaa"), d3("aaa"), d4("z"), d5("aaaaz");
	std::vector v{ d1, d2, d3, d4, d5 };

	std::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)
		std::cout << element.isbn() << " ";
	std::cout << std::endl;

	return 0;
}

练习10.18

重写 biggies,用 partition 代替 find_if。我们在10.3.1节练习10.13中介绍了 partition 算法。

#include 
#include 
#include 
#include 

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

void biggies_partition(std::vector &vs, std::size_t sz)
{
	elimdups(vs);

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

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

int main()
{
	std::vector v{ "the", "quick", "red", "fox", "jumps", 
		"over", "the", "slow", "red", "turtle" };

	std::cout << "ex10.18: ";
	biggies_partition(v, 4);
	std::cout << std::endl;
	return 0;
}

练习10.19

用 stable_partition 重写前一题的程序,与 stable_sort 类似,在划分后的序列中维持原有元素的顺序。

#include 
#include 
#include 
#include 

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

void biggies_stable_partition(std::vector &vs, std::size_t sz)
{
	elimdups(vs);

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

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


int main()
{
	std::vector v{ "the", "quick", "red", "fox", "jumps",
		"over", "the", "slow", "red", "turtle"};

	biggies_stable_partition(v, 4);
	std::cout << std::endl;

	return 0;
}

练习10.20

标准库定义了一个名为 count_if 的算法。类似 find_if,此函数接受一对迭代器,表示一个输入范围,还接受一个谓词,会对输入范围中每个元素执行。count_if返回一个计数值,表示谓词有多少次为真。使用count_if重写我们程序中统计有多少单词长度超过6的部分。

#include 
#include 
#include 
#include 

using namespace std;

size_t bigerThan6(vector const& v)
{
	return count_if(v.cbegin(), v.cend(),
		[](string const& s) { return s.size() > 6; }
	);
}

int main()
{
	vector v{ "1234", "123456", "1234567", "1234567", "1234567", "1234567" };
	std::cout << "ex10.20: " << bigerThan6(v) << std::endl;

	return 0;
}

你可能感兴趣的:(C++《i+1》,c++,算法,开发语言)