【发布时间】:2019-11-30 19:04:24
【问题描述】:
最近,我了解了 STL 类型和模板,作为练习 STL 并习惯使用它的一部分,我们遇到了挑战:
- 遍历
std::map<std::string, size_t> - 打印其内容
限制:
只能使用:
std::vector、std::map、std::string、std::algorithm、std::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等没有自动类型
可以使用其他 STL 模板,只要它们包含在 (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;
}
最初,我想使用std::for_each(std::begin(mymap), std::end(mymap), print) 来遍历地图,然后使用打印功能打印出内容。然后我意识到我实际上正在使用std::pair<std::string, size_t>,这让我考虑使用std::bind 和std::tie 来打破std::pair。但由于我认为我需要在 std::for_each 表达式中执行此操作,我如何分解 std::pair 同时还调用元素上的打印?
我也考虑过使用Structured Binding,但我不允许使用auto。
所以,问题是,我如何利用 STL 迭代映射以提取然后使用提供的辅助函数打印出键?显然,如果没有这些限制,挑战将非常容易,但鉴于此,我不知道 STL 中的哪种功能是合适的。
【问题讨论】:
-
这些限制中的大部分似乎都是随机的。
-
我认为你的意思是“标准库”而不是 STL stackoverflow.com/questions/5205491/…
-
std::for_each(m.begin(),m.end(),std::bind(print,std::bind(split,std::placeholders::_1)));此行打印所有键,其中m是您的地图。 Demo。因为std::bind来自functional,所以这段代码满足你的要求。 -
@rafix07 谢谢。这个解决方案很优雅,让我非常欣赏 std::bind