1. ホーム
  2. c++

[解決済み] C++の配列の正しいループ処理方法

2022-03-04 19:04:19

質問

最近、私は多くの例を見つけました、それらのほとんどはC++ 98に関してです、とにかく私は私の単純な配列とループを作りました( コードパッド ):

#include <iostream>
using namespace std;

int main ()
{
   string texts[] = {"Apple", "Banana", "Orange"};
   for( unsigned int a = 0; a < sizeof(texts); a = a + 1 )
   {
       cout << "value of a: " << texts[a] << endl;
   }

   return 0;
}

出力します。

の値を指定します。アップル
の値です。バナナ
の値です。オレンジ

セグメンテーションの不具合

最後のセグメンテーションフォールトを除けば、問題なく動作しています。

質問ですが、この配列とループスルーは良い方法なのでしょうか?私はC++ 11を使用しているので、それが標準に適合しており、より良い方法で行うことができなかったことを確認したいのですが?

どのように解決するのですか?

C/C++の場合 sizeof .常にオブジェクト全体のバイト数を示し、配列は1つのオブジェクトとして扱われます。注意してください。 sizeof は、配列の最初の要素または単一のオブジェクトへのポインタであり、そのサイズは ポインタ であって、指されたオブジェクトではありません。いずれにせよ sizeof が行います。 ない は、配列の要素数 (長さ) を表します。長さを得るには、各要素の大きさで割る必要があります。

for( unsigned int a = 0; a < sizeof(texts)/sizeof(texts[0]); a = a + 1 )

C++11の方法で行うことについては、おそらく最も良い方法は

for(const string &text : texts)
    cout << "value of text: " << text << endl;

これにより、コンパイラは必要な反復回数を把握することができます。

他の方が指摘されているように std::array は、C++11 では生の配列よりも好ましいとされています。 sizeof のように失敗してしまうので、やはりこの答えがベターだと思います。