2017-01-06 3 views
1

配列からintへのポインタがあるとします。これは、ポインタが指す配列のどの項目を見つけるのに最適な方法ですか?C++の配列要素のポインタからインデックスを取得する最速の方法は何ですか?

int nmbr = pointer - &array[0]; 
cout<<"Item number "<<nmbr+1; 

ポインタが6番目の項目を指している場合、これは常に「項目番号6」を出力しますか?これはエラーが起こりやすいのですか?それを行うより速い方法がありますか?重複する可能性のある値のために配列を反復処理することはできませんが、これは常に機能しますか?この状況では、配列は項目0から項目xで始まるものとします。配列の項目が連続した行に格納されていない状況があります(配列がint array[x];のように初期化されている場合)。

+3

より一般的な:; '' coutの<<はstd ::距離(配列、ポインタ)+ 1次の例では、検討することもでき、他のコンテナ上で動作する、より汎用的な解決のために

、 – PaulMcKenzie

+0

@PaulMcKenzie 'STD私はアイテムの数は1からではなく、0から始まる出力にそれをしたいので、::あなたはそれが一般的なようにしたい場合は、'(配列)を開始:) – BoBTFish

答えて

1

XTFで述べたように、動作することが保証されています。しかし、0番目の要素のアドレスを取る必要はありません。ちょうどarrayをそのまま使用してください。

#include <iostream> 
#include <iterator> 
#include <array> 

int main() 
{ 
    { 
     int array[10]; 
     int * p = &array[5]; // Somehow get a pointer to the sixth element 
     std::cout << std::distance(std::begin(array), p) << std::endl; 
    } 

    { 
     std::array<int, 10> array; 
     int * p = &array[5]; // Somehow get a pointer to the sixth element 
     std::cout << std::distance(std::begin(array), p) << std::endl; 
    } 
} 
2

+ 1のルック間違った両.. しかし、はい、これは最速かつ最も簡単な方法です。それは働くことが保証されています。 pointerと仮定すると

+0

を+ 1つのは、答えに感謝しています。編集:申し訳ありませんが、私はTWO + 1を持っていた気づいていない!再度、感謝します! – theo2003

+0

@Frank Puffer:誤って。 – theo2003

3

std::ptrdiff_t nmbr = pointer - array; 

はそれを行うだろう、arrayの要素を指すことが知られています。ポインタが配列の要素を指していない場合、動作は未定義です。 std::ptrdiff_tは標準ヘッダ<cstddef>で宣言されており、実装定義の符号付き整数型です。 intを使用すると、std::ptrdiff_tintより大きい値の範囲を表すことができるため、特に大きな配列の場合はお勧めできません(また、intより大きい値の場合、結果をintに変換すると未定義動作)。 C++での配列のインデックスはゼロに基づいているので、あなたのコード内で

+1 sが、間違っています。

some_type array[some_positive_value]; 

として宣言された何かの意味でのすべての配列は、連続する要素を持っています。 C++はCのVLA(可変長配列)をサポートしていないことに注意してください。つまり、コンパイル時にsome_positive_valueを知らなければなりません。

関連する問題