1

次のコードは、配列から stl ベクトルを作成できることを知っています。

  // the iterator constructor can also be used to construct from arrays:
  int myints[] = {16,2,77,29};
  std::vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );

(ソース: cppreference )

使用されるコンストラクターは

template <class InputIterator>
         vector (InputIterator first, InputIterator last,
                 const allocator_type& alloc = allocator_type());

上記の例で< class InputIterator >< int >の場合、最初の InputIteratorが整数ポインターではないのはなぜですか? 配列名「myints」は、&myints[0] と同等であるため、最初の要素へのポインターに崩壊します。

正しいバージョンは

template <class InputIterator>
         vector (InputIterator *first, InputIterator *last,
                 const allocator_type& alloc = allocator_type());
4

4 に答える 4

6

std::vector次のように宣言されています。

template <class T, class Allocator = std::allocator<T>>
class Vector
{
  // ...
  typedef Allocator allocator_type;

  template <class InputIterator>
  vector(InputIterator first, InputIterator last,
         const allocator_type& = alocator_type());

  // ...
};

クラス自体とコンストラクターの両方にテンプレート パラメーターがあることに注意してください。を作成するときstd::vector<int>intテンプレート引数はクラス テンプレート パラメータT用であり、コンストラクタの ではなく、ベクトルの要素の型を決定しますInputIterator

InputIteratorコンパイラによる推定を許可しています (実際には、コンストラクターのテンプレート パラメーターを推定する必要があります)。myints推測しようとしている関数に最初の引数として渡していInputIteratorます。あなたが言うように、あなたの配列の最初の要素にmyints崩壊するので、それから であると推測され、コンストラクターの次のインスタンス化を取得します:int*InputIteratorint*

vector (int* first, int* last,
        const allocator_type& alloc = allocator_type());

InputIteratorであるとは推定されませんint。これは、最初の引数として渡す完全な型であると推測されます (もちろん、2 番目の引数は一致する必要があります)。

intanは有効な入力反復子ではないため、これは理にかなっています。推定されるものは何でもInputIterator、入力反復子の要件を満たさなければなりません。int*ただし、有効です。

于 2013-03-05T10:05:32.973 に答える
4

ベクターのテンプレート化された型(intあなたの場合)とコンストラクターのパラメーターのテンプレート化された型を混同しています。のコンストラクターは、タイプ-yielding-std::vector<T>の最初のパラメーターを取ります。InputIteratorT

それは -<class InputIterator>ではありませんint。を逆参照するイテレータintです。そのようなint*

于 2013-03-05T10:07:28.633 に答える
1

これは、反復子が常にポインターであるとは限らないためです。または、別の言い方をすれば、ほとんどの Iterator はポインターではないため、提案した署名は適用されません。

したがって、あなたの場合、イテレータの概念は最初InputIteratorint*「ポインタ範囲」のより広い概念として発明されたので、これは完全に理解できます。

于 2013-03-05T10:08:24.500 に答える
0

<class InputIterator><int>を逆参照 (適用operator*())できないため、 にすることはできませんint

于 2013-03-05T10:06:23.547 に答える