c ++中的curly括号语法和迭代器

时间:2017-06-21 18:37:57

标签: c++ iterator brackets

我对C ++ 11有疑问。我知道下面的函数会反转字符串,但我不知道{}语法是什么?这是什么类型的结构?我通常用Java编写代码。我无法弄清楚这是什么?

string reverseString(string str){
    return{ str.rbegin(), str.rend() };
}

我还有另一个问题,这种方法反转字符串效率有多高?因为我认为要反转我们应该改变字符的位置,如果我们想要在内存上连续的字符串。

2 个答案:

答案 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());

下一点魔法是rbeginrend提供反向迭代器,因此输入string将被反向读入输出string

string迭代器are Random Access Iterators,因此迭代器将在O(N)时间内遍历。在构建新字符串,复制旧字符串以及可能调整大小缓冲区方面没有太大的魔力,新字符串将在O(N)时间PLUS中构建,无需任何时间来调整支持新{{1}的缓冲区的大小}。

这导致

  • O(N)的复杂性,因为在将N个元素从一个string复制到另一个之前预先设置了缓冲区,或者
  • Amortized O(N)复杂性,因为缓冲区按需调整大小,导致一些额外的旧缓冲区分配和复制到新缓冲区以及从一个string复制到另一个缓冲区。

第二种选择是可能的,因为string构造函数不要求输入迭代器是随机访问,这使得计算所需缓冲区的大小可能比调整大小更加昂贵。但它可能会对随机访问和预设进行特殊的案例测试。