2

我正在尝试 codefights.com 并注意到有人回答了一个问题,该问题涉及在向量中给出所有最长的字符串:

std::vector<std::string> r, allLongestStrings(std::vector<std::string> a) {
    int b=0;
    for (s:a) if (s.size()>b) b=s.size();
    for (s:a) if (s.size()==b) r.push_back(s);
    return r;
}

他在函数的返回类型说明符中声明了一个变量,谁能告诉我为什么允许这样做?我没有在我的机器上编译,也找不到执行此操作的 gcc 扩展,在此先感谢:)。

4

2 回答 2

1

查看参考decl-specifier-seq),我看不出如何在函数名之前声明返回变量。

使用 C++14,您可以使用auto关键字删除重复提及的返回类型:

auto allLongestStrings( const std::vector<std::string>& a ) {
    std::vector<std::string> r;
    std::size_t b = 0;
    for( const auto& s : a ) if( s.size() > b ) b = s.size();
    for( const auto& s : a ) if( s.size() == b ) r.push_back( s );
    return r;
}

我修复了代码的其他一些内容:

  • 为了提高效率,将参数声明a为 const 引用,这样就不会被复制
  • 声明bstd::size_t匹配返回类型std::vector::size()
  • 在 range-for 循环中,类型说明符是必需的(即使它是auto);添加了 const 参考以提高效率

现场演示。

于 2017-04-17T07:51:01.247 回答
0

混合变量/函数声明似乎没问题,尽管 gcc 抱怨函数定义不应该存在,但我认为在全局范围内没问题。但如果没有给出函数定义,即使在非全局范围内,它也是 100% 有效的语法。此声明只是对相同前导类型的几个项目的常规声明。例如,我们可以声明多个不同类型但具有相同前导的项目,如下所示:

// single line declaration
int i = 0, * p_i = nullptr, ai[2] = {42,42}, geti(void), * * getppi(void);
// the same as
int i = 0;
int * p_i = nullptr;
int ai[2] = {42, 42};
int geti(void);
int ** getppi(void);

所以r只是一个常规变量 type std::vector<std::string>,后跟返回相同 std::vector 类型的函数 allLongestStrings 。

由于历史原因,这种紧凑的申报表存在。基本上它有助于节省相当多的字节来存储和编译源文件。

这种形式的for循环可能是当前形式标准化之前的早期实验扩展。

于 2017-04-17T07:56:12.117 回答