【问题标题】:Why do C++ STL function calls need to be so verbose?为什么 C++ STL 函数调用需要如此冗长?
【发布时间】: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


【解决方案1】:

不幸的是,std::toupper 有重载,因此 lambda 是解决方法。

然后,使用range-v3,您可以将其简化为:

auto to_upper = [](unsigned char c) { return std::toupper(c); }; // To handle overloads
std::cout << std::string("Hello world" | ranges::view::transform(to_upper))
          << std::endl;

Demo

【讨论】:

    【解决方案2】:
    std::transform(s.begin(), s.end(), s.begin(),
                   [](unsigned char c) { return std::toupper(c); });
    

    一般形式就行了。永远!

    您可以使用它来就地转换或转换为单独的结果:
    std::transform(s.begin(), s.end(), result.begin(),...

    它可以改变整个容器,或者只是一部分。您选择的任何部分:
    std::transform(s.begin() + i, s.begin() + j, s.begin() + i,...

    它适用于任何序列,即使元素不是容器的一部分。

    所以无论如何都需要通用形式,因为它是最有用的。

    【讨论】:

    • 我理解通用表格的必要性。我很想知道为什么至少没有其他形式。
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多