我正在尝试使用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扩展程序,提前感谢:)。
答案 0 :(得分:1)
查看reference( 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引用,因此不会被复制b
声明为std::size_t
以匹配std::vector::size()
的返回类型auto
);为效率添加了const参考答案 1 :(得分: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
只是std::vector<std::string>
类型的常规变量,后跟函数allLongestStrings,返回相同的std :: vector类型。
此紧凑声明表格由于历史原因而存在。基本上它有助于节省相当多的字节来存储和编译源文件。
这种形式的for
循环可能是在当前形式标准化之前的早期实验扩展中。