【发布时间】:2019-12-01 06:57:54
【问题描述】:
我目前正在学习 C++17,作为练习使用标准库以习惯使用这些功能的一部分,我们遇到了挑战:
- 迭代
std::map<std::string, size_t>(也称为std::map<file_name, file_size>) - 打印空文件名
size_t == 0并返回其计数 - 打印不为空的文件名
size_t != 0并返回其计数 - 从地图中删除
std::pairswhose size_t == 0
限制:
只能使用标题:
<vector>、<map>、<string>、<algorithm>、<functional>无法定义复杂类型或模板
无法使用
. (member access), -> (member access via pointer), * (dereference) operators不能使用
for, while, do-while nor if-else, switch和其他条件句可以使用
std::for_each等函数模板的函数来遍历元素集合没有 lambdas
没有
std::cout、std::cerr、std::ostream等没有自动类型
可以使用其他函数,只要它们包含在限制 #1 中描述的标头中
允许使用这些功能:
void print(const std::string& str)
{
std::cout << str << std::endl;
}
std::string split(const std::pair<std::string, size_t> &r)
{
std::string name;
std::tie(name, std::ignore) = r;
return name;
}
bool checkEmpty(const std::pair<std::string, size_t>& r, bool trueIfIsNot
)
{
file_size size;
std::tie(std::ignore, size) = r;
bool result = (size == 0);
if (trueIfIsNot)
{
result = !result;
}
return result;
}
我已经开始欣赏在我之前的帖子中使用std::bind 和std::for_each。这一次,我如何添加谓词和条件来修改输出而不使用限制 #4 规定的语法?
我目前正在考虑使用std::transform() 或std::copy_if() 等。我对标准库的许多功能有一些了解,但我认为我在语法方面很弱,无法理解事物如何协同工作,所以我不知道如何使用它们。
【问题讨论】:
标签: c++ c++17 predicate stdmap c++-standard-library