2017-06-21 23 views
1

我有問題約C++ 11。我知道下面的函數反轉了一個字符串,但我不知道什麼是{}語法?這是什麼類型的結構?我通常使用Java編碼。我無法弄清楚這是什麼?捲毛括號語法和迭代器在C++

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

我也有另一個問題,這種方法扭轉字符串有多高效?因爲我認爲要扭轉角色,如果我們想讓內存上的字符串連續,我們應該改變角色的位置。

+2

該語法被稱爲「統一初始化」,在這裏它只是(隱式地)調用構造函數。這裏的複雜性在字符串的大小上是線性的。 – Arcinde

+2

這是[複製列表初始化](http://en.cppreference.com/w/cpp/language/list_initialization)。請參閱語法#8 *'return {arg1,arg2,...};'* –

+0

您正在使用括號表示調用'std :: string'構造函數 – RPGillespie

回答

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)的時間及所需大小的緩衝區支持新string任何時候。

這導致在任一

  • O(N)的複雜性,因爲緩衝區複製複製N個元素之前從一個string到另一個,或
  • 預先選徑
  • Amortized O(N)的複雜性,因爲所述緩衝液是調整需求,導致了一些額外的分配和舊緩衝區以新的複製以及複製從一個string到另一個。

第二個選項是可能的,因爲string構造不要求輸入迭代是隨機接入,使得計算所需的緩衝區的大小可能比presizing調整大小更昂貴。但它可能會有一個特殊情況測試隨機訪問和預設。

3

該代碼也可以被寫爲:

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()}; 
}