2017-06-21 12 views
1

C++ 11に関する質問があります。私は以下の関数が文字列を逆転させることを知っていますが、{}の構文はわかりません。どんなタイプの構造ですか?私は通常、Javaでコード化します。私はそれが何であるか分かりません。C++の中括弧構文とイテレータ

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

また、別の質問がありますが、この方法では文字列を反転するのが効率的ですか?逆にすると思いますので、メモリ上で連続している文字列が必要な場合は、文字の位置を変更する必要があります。これは、2つのイテレータ(最初と最後)から新しい文字列を作成する範囲コンストラクタを使用

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

+2

構文は「uniform initialization」と呼ばれ、ここでは(暗黙的に)コンストラクタを呼び出します。ここでの複雑さは、文字列のサイズに線形です。 – 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()}; 

魔法の次のビットはrbeginrendが逆イテレータを提供するので、入力string出力stringに後方に読み込まれる。より身近な構文で

return string(str.rbegin(), str.rend()); 

あります

stringイテレータare Random Access Iteratorsです。したがって、イテレータはO(N)時間内にトラバースされます。新しい文字列を作成し、古い文字列をコピーしたり、いくつかのバッファのサイズを変更したりすることはそれほど魅力的ではありません。新しい文字列は、新しいstringをバッキングするバッファのサイズを決めるのにいつでも追加できます。

バッファがあるため、バッファが他の1つのstringからコピーするN個の要素をコピーする前にプレサイジング、又は

  • Amortized O(N)の複雑されているため、これはどちらか

    • O(N)複雑になります要求に応じてサイズを変更して、古いバッファを新しいものに割り当てたりコピーしたりして、一方のバッファから他方のバッファにコピーします。

    stringコンストラクタは、潜在的にリサイズよりも高価presizingに必要なバッファのサイズを計算しながら、ランダムアクセスされる入力イテレータを必要としないため、第2のオプションは、可能です。しかし、ランダムアクセスとプレサイズをテストする特別なケースがあるかもしれません。

  • 3

    このコードはまた、のように書くことができます。均一な初期化に

    ありがとうございますようにそれを書くことができます。

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

    とコンパイラが既に戻り値の型がstringであることを知っているので、あなたはこの「奇妙につながる、明示的に指定する必要はありません"構文:

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