2016-04-20 18 views
7

私はC++を学んでいるだけで、Accelerated C++を使用しています。なぜ彼は "int"を使用する代わりに "typedef vector <double> :: size_type"を使用しましたか

ベクターの例では、ライターは次のコードを使用しました。

typedef vector<double>::size_type vec_sz; 
vec_sz size = homework.size; 

私は彼がvector<double>::size_type size = homework.size;として、次のコマンドを記述する必要はありませんが、私の質問は、なぜ彼はだけではなく、整数としてsizeを宣言していないされるようにtypedef vector<double>::size_type vec_sz;がある知っていますか?

int size = homework.size; 

これはベクターを使用しているためですか?

もしそうなら、それはベクトルイテレータによって返される値を通常の変数に格納できないということですか?

+1

ここにあなたの質問があります: 'ベクトル :: size_type'の背後にあるタイプは何ですか? –

+1

簡単な答えは、作者が 'size_t'を使う可能性があり、それはおそらく' int 'と同じ* not *であることです(通常は 'unsigned int'または' unsigned long'と同じです。それのunsignednessは大いに重要であり、サイズの違いはあなたがやっていることに依存することもできます)。長い答えは、実際の回答ボックスであっても非常に長いです。 _good_ C++の本は実際に 'int'と' container_type'と 'container_type'との間の取引について説明していますが、そうではないようです。 – zwol

+1

ポイントは、 'std :: vector :: size_type'の後ろにどんな型があるのか​​正確には分かりませんが、どんな型であれ、それを宣言する簡単な方法が欲しいです。その 'int' btwであることはありそうもありません。我々はそれが*ベクトル*の要素の最大数に対処するのに十分大きい数を保持できる型であることを知っています。 – Galik

答えて

6

なぜ彼はサイズを整数として宣言しませんでしたか?

整数ベクトルの大きさを格納するための正しいタイプではないので、二つの理由:

  • int陰性であることが許されます。ベクトルの大きさがさえ、符号なしintが最大ベクトルの大きさに

intを保持するのに十分な大きさではないかもしれない

  • 非負である小型ベクトルのため正常に動作しますが、一般的なアプローチのために、あなたはvector<T>::size_typeを使用する必要があります。型は符号なしであることに注意してください。インデックスを逆順に反復するときは注意が必要です。

    これは、ベクトルイテレータによって返される値を通常の変数に格納できないことを意味しますか?

    イテレータは、タイプがvector<T>::size_typeではないため、データ型はまったく異なります。

  • +0

    本質的には、unsigned intのより大きいサイズを保持できるので、size_typeを使用していますか?私はあなたの返事を正しく読んでいる。 –

    +1

    @OlaniyiJinaduはい、それは本質的に事です。 vectorのtypedefを使用すると、索引が収まるかどうか心配する必要はありません。 – dasblinkenlight

    5

    まず、std::vector::size_typeintではありません。

    符号なし整数型(通常std::size_t

    そして

    std::size_tは(sizeof演算子の結果の符号なし整数型、ならびにsizeof...オペレータとalignof演算子でありますC++ 11以降)。

    第2に、C++ 11からは、auto specifierを使用して自動的に型を推定できます。

    auto size = homework.size(); 
    

    ところで:homework.sizeは奇妙なようで、あなたはhomework.size()を意味するかもしれません。

    +0

    はい。私は 'homework.size()'を意味しました。 lol –

    関連する問題