【发布时间】:2016-09-29 11:50:23
【问题描述】:
为什么不能更简短地调用 STL 函数?我在cppreference.com 上查看以下代码 sn-p:
#include <string>
#include <cctype>
#include <algorithm>
#include <iostream>
int main()
{
std::string s("hello");
std::transform(s.begin(), s.end(), s.begin(),
[](unsigned char c) { return std::toupper(c); });
std::cout << s;
}
在我看来,应该可以使这个电话更简短。第一个明显的事情是取消 lambda:
std::string s("hello");
std::transform(s.begin(), s.end(), s.begin(), std::toupper);
std::cout << s;
但这不起作用。由于您通常想要转换整个容器,因此应该可以将其用作参数:
std::string s("hello");
std::transform(s, s.begin(), std::toupper);
std::cout << s;
您也可以省略输出迭代器以按值返回结果:
std::string s("hello");
std::cout << std::transform(s, std::toupper);
此时临时变量是不必要的:
std::cout << std::transform("hello"s, std::toupper);
增加了可读性:
using namespace std;
cout << transform("hello"s, toupper);
这不是更具可读性和更好吗?为什么不设计 STL 函数来允许编写这样的简短代码?在未来的 C++ 标准版本中是否可以缩短这些调用?
【问题讨论】:
-
对于最后两个示例,
"hello"的类型为const char[N],这意味着它是不可修改的。 -
对于初学者,你不能只在
chars 上使用std::toupper,因为它的C 过去的东西。 Details. -
同时缩短内容并删除“结束”迭代器等。对于大多数情况,您可能会使其不那么冗长,但您可以“删除”不是这样的情况。 C++ 可以非常灵活和优雅,因为您为操作提供了开始和结束迭代器。
-
对于冗长的语法,委员会正在努力。欢迎提出建议。
-
范围应该有所帮助。我相信它现在是一个TS。否则 range-v3 是一个不错的选择。
标签: c++ stl functional-programming