web-dev-qa-db-ja.com

配列をベクトルに変換する最も簡単な方法は何ですか?

配列をベクトルに変換する最も簡単な方法は何ですか?

void test(vector<int> _array)
{
  ...
}

int x[3]={1, 2, 3};
test(x); // Syntax error.

Xをint配列からベクトルに最も簡単な方法で変換したい。

77
Amir Saniyan

2つの反復子を取るvectorコンストラクターを使用し、ポインターが有効な反復子であることに注意し、配列からポインターへの暗黙的な変換を使用します。

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + sizeof x / sizeof x[0]);
test(v);

または

test(std::vector<int>(x, x + sizeof x / sizeof x[0]));

ここで、sizeof x / sizeof x[0]は明らかにこのコンテキストの3です。これは、配列内の要素の数を取得する一般的な方法です。 x + sizeof x / sizeof x[0]は1つの要素を指すことに注意してくださいbeyond最後の要素。

124
Fred Foo

個人的には、C++ 2011のアプローチがとても好きです。なぜなら、sizeof()を使用したり、配列の境界を変更した場合に配列の境界を調整したりする必要がないからです。君も欲しかったら):

#include <iterator>
#include <vector>
int x[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(std::begin(x), std::end(x));

明らかに、C++ 2011では、とにかく初期化子リストを使用したい場合があります。

std::vector<int> v({ 1, 2, 3, 4, 5 });
101
Dietmar Kühl

ポインターは、他のイテレーターと同様に使用できます。

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)
13
Rafał Rawicki

ここで間違った質問をしている-すべてをベクトルに強制する代わりに、テストを特定のコンテナではなくイテレータで動作するように変換する方法を尋ねます。互換性を維持するためにオーバーロードを提供することもできます(そして同時に他のコンテナーを無料で処理します):

void test(const std::vector<int>& in) {
  // Iterate over vector and do whatever
}

になる:

template <typename Iterator>
void test(Iterator begin, const Iterator end) {
    // Iterate over range and do whatever
}

template <typename Container>
void test(const Container& in) {
    test(std::begin(in), std::end(in));
}

あなたができること:

int x[3]={1, 2, 3};
test(x); // Now correct

Ideoneデモ

7
Flexo