2016-12-17 2 views
1

私は配列にのみアクセスでき、ベクトルにはアクセスできません。配列の終わりを表す適切な方法

と言ってください。には100個のオブジェクトの配列が必要ですが、少なくてもかまいません。それが少ない場合は、オブジェクトの残りの部分が必要でないことがわかっているように、この点をマーキングするエレガントな方法がありますか?

これをオブジェクト自体に保存する必要はありますか?ヌル文字に相当するものはありませんか?

+2

代わりにポインタの配列を持ち、最初に 'nullptr'で停止しますか? – GSerg

+2

@OP - アレイに問題がある理由の1つだけを述べました。 100個のオブジェクトの配列を宣言した場合は、100個のオブジェクトがあります。 – PaulMcKenzie

+0

どのような種類のオブジェクトですか?もちろん、 'int'の配列を持つことができますし、それらを反復処理するときに最初の' 0'値で停止することができます。 :) – wally

答えて

0

いいえ、メモリ内の配列の終わりを示すものはありません。 「ヌル文字に相当するものはありません」。これを追跡するのはあなたの責任です。

std::vectorを使用する多くの理由の1つは、ベクターがこれを追跡していることです。しかし、あなたが述べたように、配列にはアクセスでき、ベクターにはアクセスできないので、ベクターの責任を扱うのはあなた次第です。

+0

配列の終わりを示すヌルまたはゼロの値は、文字列のヌル文字に相当するリテラルです。実際、 'nullptr'を使ってポインタの未知の長さの配列の終わりをマークするのは普通のパターンです(' std :: vector'や 'std :: array'を使うことで取り除かれます)。あなたが言うように、 'std :: vector'やサイズフィールドを持つ同等のデータ構造体を使うのが望ましいでしょう。 –

+0

ヌルターミネーション配列を使用する主な欠点の1つは、サイズをチェックすることはO(n)操作であり、サイズをチェックせずにランダムアクセスを安全に行うことはできないため、ランダムアクセスもO(n)操作になります。 –

3

いくつかの考えられる方法があります。

'\0'のように、センチネル値を使用して、配列の末尾にその値を置くことができます.Cスタイルの文字列の最後に印を付けます。その問題は、保存しなければならないデータにセンチネル値が決して現れないことを確認する必要があることです。

配列の値の数を持ち帰り、その値を配列を処理する関数に渡すことができます。

配列の最後の要素を1つ指すポインタを作成し、ポインタのペアとして配列を扱うことができます。最初の要素を指すポインタと最後のポインタを指すポインタです。これはSTLアルゴリズムと互換性があるため、おそらくあなたの最高の全体的なアプローチです。

関連する問題