2012-10-31 5 views
9

新しいメモリを割り当ててデータをコピーするのではなく、既存のデータを使用してstd::vectorを作成できますか?既存のデータのC++ STLベクトル

メモリ領域(C配列または別のベクターの一部など)を持っていて、ベクターに似たアクセスを提供したい場合は、ベクトルを作成して使用するように指示できますこのメモリブロック?

+1

は、どのようにそのベクトルを使用するつもりですか? – Andrey

+0

「ベクター」やそれに類するコンテナをまったく使用しない方が良いかもしれません。なぜデータを別のコンテナに入れたいのですか? –

+1

ベクターの使い方を知っておくことが重要です。例えば、Luchianの答えでは、結果のベクトルは 'ベクトル'ではなく、 'vector 'になります。だから、もしあなたがベクトルを必要とする理由が、 'ベクトル'を期待する関数に渡すのなら、それはあなたを助けません。あなたが他の目的のためにベクターを必要とするなら、おそらくそれはあなたを助けるでしょう。 –

答えて

7

いいえ、これを行う独自のクラスを作成することもできます。これはかなり一般的な必要性であるので、他の誰かがこれを既に行っていれば私は驚くことはありません。

しかし、通常のC++の方法では、イテレータで動作するテンプレートコードを記述することになります。ベクタの任意の部分、またはC配列の任意の部分(およびそれ以外の部分)のイテレータを作成できます。だからイテレータのテンプレートコードを書くことはおそらくあなたがしなければならないことです。

+1

カスタムアロケータはなぜ機能しませんか? –

+0

もう少し説明できますか?あなたはそれがコンストラクタにイテレータを受け入れ、内部的に使用するベクトルのようなインタフェースを持つテンプレートクラスを作成することを意味しますか? – baruch

+1

アロケータが仕事をする可能性があるときに、なぜホイールを再開発しようとしますか? "新しい"ベクトルは99%のコードを 'std :: vector'と共通に持つことができます。 – Acorbe

2

vectorを作成するときにカスタムアロケータを使用できるため、技術的に可能です。

とはお勧めできません。私はちょうど固定サイズのベクトルを作成する(明らかにあなたはそれを保持することができます)し、std::copyを使用します。

+0

既存の配列のサイズが「n」で、何らかの理由でベクトルがアロケータにサイズ「n + 1」の空間を要求するとどうなりますか?私はそれが間違いなく起きるとは言っていませんが、標準ではベクトルが好きな余白で余分に割り振ることを許し、割り当ての最後に余分なスペースを使いたいと思っています。あなたはおそらく不愉快なことに気づくためにアロケータを書くことができ、通常のアロケータのように振る舞います。 –

1

コンテナを反復するアルゴリズムは、入力範囲を定義する反復子のペアを受け入れます。大きなコンテナの中央を指すイテレータでアルゴリズムを使用することができます。

例:

std::vector<int> big_vector(100000); 
// initialize it 
//... 
std::sort(big_vector.begin()+100, big_vector.begin()+200); // sort a subrange 

int big_array[100000]; //c-style array 
// initialize it 
//... 
std::sort(std::begin(big_array)+300, std::begin(big_array)+400); // sort a subrange