2017-08-28 9 views
0
int[] a = {1,2,3}; 
int* b = new int[3]{4,5,6}; 

bの始めと終りを取得したいと思います。 std::begin()aで動作しますが、bでは動作しません。 bという2つのポジションを得る適切な方法はありますか?新しい配列で作成された配列の始まりと終わりを得る方法

+3

私は裸の新しいものを使用することをお勧めします。代わりに 'array'か' vector'を使います。 –

+2

あなたは頼みになることはありませんが、バッファサイズ(その3)を記録しておく必要があります。それを行うクラスを書く方が良いです。ねえ、あなたは 'std :: vector'について聞いたことがありますか? – StoryTeller

+0

通常の配列の使用を主張する場合は、要素の数を追跡するか、配列の終わりを示す通常のデータには決して出現しない値を使用するヌル終了文字列に似た何かを実行する必要がありますこの特別な値に達するまで配列を繰り返し処理します。 – Matt

答えて

2

std::beginstd::endへの参照があると、開始イテレータと終了イテレータがコンテナの最初の要素と最後から1つ後の要素へのポインタになります。配列の場合、これは二重に真です。イテレータの実際のポインタを使用できるからです。 std::begin関数は最初の要素からポインタを返すaようなアレイ、およびstd::end機能について

は、最後の要素を超えたものとのポインタを返します。

この情報を知ると、イテレータのポインタが "begin"と "end"の場合は、配列とまったく同じなので簡単にわかります。私。 firstとlast-beyond-last要素へのポインタ。

"begin iterator"は単にb(最初の要素を指しているため)で、 "end iterator"は最後の要素を超えるポインタへのポインタであるb + 3です。

+0

ええと、実際のCスタイルの配列ではなく、std :: arrayラッパーのためのものではありませんか? – Matt

+0

@Matt ['std :: array'](http://en.cppreference.com/w/cpp/container/array)イテレータはランダムアクセスイテレータであり、プレーンポインタを使用して実装できますが、する必要がある。プレーンなCスタイルの配列の場合、最も簡単なので、実装は最も可能性が高いポインタです。 –

+0

ポインタに対して 'std :: begin'を使うことはできません。そのサイズを知っている配列参照のためのオーバーロードがありますが、これは普通のポインタには当てはまりません。 –

関連する問題