我对C ++ 11有疑问。我知道下面的函数会反转字符串,但我不知道{}语法是什么?这是什么类型的结构?我通常用Java编写代码。我无法弄清楚这是什么?
string reverseString(string str){
return{ str.rbegin(), str.rend() };
}
我还有另一个问题,这种方法反转字符串效率有多高?因为我认为要反转我们应该改变字符的位置,如果我们想要在内存上连续的字符串。
答案 0 :(得分:4)
此代码也可以写为:
string reverseString(string str){
return string(str.rbegin(), str.rend());
}
它使用范围构造函数,它从两个迭代器(开始和结束)创建新字符串。
感谢统一初始化,您可以将其编写为:
string reverseString(string str){
return string{str.rbegin(), str.rend()};
}
由于编译器已经知道返回类型为string
,因此您不必明确指定它,这会导致这种“奇怪”的语法:
string reverseString(string str){
return {str.rbegin(), str.rend()};
}
答案 1 :(得分:2)
正在使用的内容称为Uniform Initialization。
我承认,看起来有点奇怪。该函数知道它需要返回一个string
,但是它已被馈送一对迭代器。花括号允许编译器根据大括号的内容尝试构造string
,当然,constructor number six listed here将尝试从开始和结束迭代器构造一个字符串。
所以
return {str.rbegin(), str.rend()};
是更熟悉的语法
return string(str.rbegin(), str.rend());
下一点魔法是rbegin
和rend
提供反向迭代器,因此输入string
将被反向读入输出string
。
string
迭代器are Random Access Iterators,因此迭代器将在O(N)时间内遍历。在构建新字符串,复制旧字符串以及可能调整大小缓冲区方面没有太大的魔力,新字符串将在O(N)时间PLUS中构建,无需任何时间来调整支持新{{1}的缓冲区的大小}。
这导致
string
复制到另一个之前预先设置了缓冲区,或者string
复制到另一个缓冲区。第二种选择是可能的,因为string
构造函数不要求输入迭代器是随机访问,这使得计算所需缓冲区的大小可能比调整大小更加昂贵。但它可能会对随机访问和预设进行特殊的案例测试。