2011-07-28 12 views
1

ベクトルを「ほぼ等しい」部分に分割し、それらの部分のサブベクトルを作成しようとしています。1つ少ない要素でベクトルを作成するベクトルコンストラクタ

私はここで、元の質問をしています:How to split a vector into n "almost equal" partsが、私は本当に良い解決策を見つけ、私は、使用ここからしようとしています何:Best way to extract a subvector from a vector?

私は開始と終了の値の整数を作成するために、この機能を書いた(ラウンド指定された桁数に丸め私の関数である)

void split(double number, double parts) 
{ 
    double loop = number/parts; 

    for(int i = 0; i < parts; i++) 
    { 
     int start = round(i * loop, 0); 
     int end = round((i + 1) * loop - 1, 0); 
     cout << start << " " << end << endl; 
    } 
} 

は、この機能は、これまでOKに動作しますが、私の問題は、私はこれを実行しようとすることです:。

vector<some> dest(&source[start], &source[end]); 

次に、1つのLESS要素を作成し、次にそれを要求します。私はそれは99の要素を持つことになります

vector<some> dest(&source[0], &source[99]); 

でそれを呼び出す場合、私は代わりに100 ですが、なぜでしょう、例えば意味ですか?

どうすれば修正できますか?私は[end + 1]を使用すると、最後のベクトルで "subscript out of range"で終了します。

答えて

4

vectorコンストラクタ(およびポインタ範囲を受け入れるすべてのSTLコンストラクタ)は、一連のSTLスタイルのイテレータを使用するように設計されています。イテレータを使用する場合は、最初と最後の要素ではなく、最初と最後の要素へのポインタを指定して範囲を指定します。あなたが別のvectorのうちサブレンジ(0、99)のコピーとしてvectorを作成したい場合は、これが最初の100個の要素のスライスを指定ではなく、するvectorイテレータを使用していることを

vector<some> dest(source.begin(), source.begin() + 100); 

ノートを書くことができoperator[]。指定されたインデックスが範囲外の場合、動作が未定義です。あなたの場合、この未定義の動作はランタイムデバッグエラーとして現れます。反復子は、このように使用するように特別に設計されているので、この問題はありません。

あなたはvectorコンストラクタへの入力として生のC++の配列を使用したい場合、あなたはこのようにそれを行うことができます:

vector<some> dest(source, source + 100); 

・ホープこのことができます! vがある場合、それは&v[n]を使用する法的ませんが

+0

OK、わかりました。私の機能にとって、これは適切な呼び出しですか?ベクトル dest(source.begin()+ start、source.begin()+ end + 1); – zsero

+0

'end'が最後の要素のインデックスであると仮定すると、それは正しいです。しかし、典型的には、 'end'という名前は実際の最後の要素ではなく1つの終わりを示すためにC++コンテナに関して使用されるので、' last'のように名前を変更したいかもしれません。 – templatetypedef

+0

ありがとう!今は「ラスト」と呼ばれています – zsero

0

n要素を持つstd::vectorは、あなたの代わりに

vector<some> dest(v.begin()+first, v.begin()+last+1); 

でもlast+1 == n場合を使用することができます。

関連する問題