配列をベクトルに変換する最も簡単な方法は何ですか?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
最も簡単な方法でxをint配列からベクトルに変換したいと思います。
回答:
vector
2つのイテレーターをとるコンストラクターを使用します。ポインターは有効なイテレーターであることに注意してください。また、配列からポインターへの暗黙の変換を使用してください。
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つの要素を指すことに注意してください。
sizeof x / sizeof x[0] == std::extent<decltype(x)>::value
個人的には、C ++ 2011のアプローチが非常に気に入っていsizeof()
ます。これは、配列の境界を変更した場合でも、配列の境界を使用したり調整したりする必要がないためです(必要に応じて、C ++ 2003で関連する関数を定義することもできます)。 ):
#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 });
std::vector<T>
常にT
オブジェクトを所有します。これには2つの意味があります。オブジェクトをベクターに挿入すると、オブジェクトはコピーされ、メモリに配置されます。短い文字列のシーケンスなど、かなり小さいオブジェクトの場合、コロケーションはパフォーマンスを大幅に向上させます。オブジェクトが大きくてコピーに費用がかかる場合は、オブジェクトへの[なんらかの方法でリソースを管理する]ポインタを保存することをお勧めします。どちらの方法がより効率的かはオブジェクトによって異なりますが、選択することができます。
ポインターは、他のイテレーターと同様に使用できます。
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)
const size_t X_SIZE = 3;
配列サイズを表すために使用したり、sizeofからそれを計算したりして、配列サイズを抽象化したい場合があります。読みやすくするためにその部分は省略しました。
あなたはここで間違った質問をしています-すべてをベクトルに強制する代わりに、特定のコンテナの代わりにイテレータで動作するようにテストを変換する方法を尋ねます。互換性を維持するためにオーバーロードを提供することもできます(他のコンテナを同時に無料で処理します)。
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デモ)
簡単な方法の1つは、 assign()
は、vector
クラスで事前定義されている関数をすることです。
例えば
array[5]={1,2,3,4,5};
vector<int> v;
v.assign(array, array+5); // 5 is size of array.
vector<int> a(5,10);
意味するmake room for 5
int`を読んで、10で初期化しますが、x、x + ...はどのように機能しますか?説明できますか?