编写程序,使用 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;
}
编写名为 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;
}
标准库定义了名为 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;
}
编写一个 lambda ,接受两个int,返回它们的和。
auto f = [](int i, int j) { return i + j; };
编写一个 lambda ,捕获它所在函数的 int,并接受一个 int参数。lambda 应该返回捕获的 int 和 int 参数的和。
int x = 10;
auto f = [x](int i) { i + x; };
使用 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.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;
}
重写 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;
}
用 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;
}
标准库定义了一个名为 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;
}