2

C++のforeachループ内の配列へのポインターを使用しようとしています。「foreachステートメントはタイプ'int*'の変数を操作できない」ため、以下のコードは機能しません。配列がスタックではなくヒープ上にあるように、new演算子を使用したいのですが、ここで構文を理解できないようです。助言がありますか?

#include <iostream>
using namespace std;

int main() {
    int total = 0;

    int* array = new int[6];
    array[0] = 10; array[1] = 20; array[2] = 30;
    array[3] = 40; array[4] = 50; array[5] = 60;

    for each(int i in array) {
        total += i;
    }

    cout << total << endl;
}
4

6 に答える 6

2

次のようなforループをいつでも使用できます。

for (int i = 0; i < 6;i++)
{
total += array[i];
}

とはいえ、「gcnew」を使った「foreach」の答えはすでに出ているので省略しています。別の方法として、次のようにベクトルを使用することもできます。

#include <iostream>
#include <vector>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int total = 0;
    vector<int> myarray;

    myarray.push_back(10);
    myarray.push_back(20);
    myarray.push_back(30);
    myarray.push_back(40);
    myarray.push_back(50);
    myarray.push_back(60);

    for each(int i in myarray) {
        total += i;
    }

    cout << total << endl;
    return 0;
}

これがお役に立てば幸いです...

于 2012-07-23T05:15:25.423 に答える
2

C ++ 0xは、他の言語forと同等に機能する範囲ベースのループを導入しました。foreachそれらの構文は次のようなものです。

int arr[5]={1,2,3,4,5};
for( int & tmp : arr )
{
//do something
}

これらのループは、Cスタイルの配列、初期化子リスト、およびイテレータを返すbegin()関数とend()関数が定義されているすべての型で機能します。int *単なる生のポインタであるため、イテレータを返すbegin()関数とend()関数がないことを強く信じています。foreachまた、Qtのような他の同等のforeachもの、またはあなたが投稿したものも同じように機能するので、このように使用することはできないと思います。msdnはそれがコレクションのために働くと言います:

for each (type identifier in expression) {
      statements
}

表現:

管理対象配列の式またはコレクション。コンパイラーは、コレクション要素をObjectからID型に変換できる必要があります。式は、IEnumerable、IEnumerableを実装する型、またはGetEnumeratorメソッドを定義する型に評価されます。後者の場合、GetEnumeratorは、IEnumeratorを実装する型を返すか、IEnumeratorで定義されているすべてのメソッドを宣言する必要があります。

繰り返しになりますが、生のポインタがあるため、機能しません。

于 2012-07-23T05:33:32.387 に答える
2

あなたが使用しているのは、一部のマイクロソフトの従業員によってさえ推奨されていないVisual C ++拡張機能です( STLfor eachがそれについて悪いことを言っているのを聞いたことがありますが、どこにあるのか思い出せません)。

のような他のオプションがあり、std::for_eachC ++ 11からの範囲ベースです(ただし、Visual C ++はまだそれをサポートしていないと思います)。ただし、ここで使用する必要があるのはそれではありません。std::accumulateこれは次の目的で作成されたジョブであるため、を使用する必要があります。

total = std::accumulate(array, array + 6, 0);

このMicrosoftfor each構造の使用方法に本当に興味があるのであれば、ポインタがあればできないと確信しています。代わりに使用する必要がありますstd::vector。とにかくそれをする必要があります。

于 2012-07-23T05:39:47.720 に答える
1

私が考えることができる唯一の方法は、特にヒープ上にストレージが必要な場合に、参照型の配列を反復処理することです。

ここでマイクロソフトはそうする方法をあなたに示します

しかし、あなたの場合、最も単純な代替案(配列をヒープに配置したい場合)は次のようになります:-

 array<int>^ arr = gcnew array<int>{10, 20, 30, 40. 50, 60};
 int total = 0;    

for each (int i in arr){
  total+=i;
}

gcnewは、ガベージコレクションされたヒープ上に管理対象タイプ(参照型または値型)のインスタンスを作成します。gcnew式の評価の結果は、作成される型へのハンドル(^)です。

于 2012-07-23T05:32:22.637 に答える
1

std::vectorまたはstd::arrayを使用するには、などの標準ライブラリコレクションを使用する必要がありますfor each

for eachこのコードは標準のC++ではないため、Visual C ++の拡張機能であるため、移植性がないことに注意してください。std::for_eachまたはC++11自動遠隔ループを使用することをお勧めします。

于 2012-07-23T05:45:39.723 に答える
0

VC++はISO/ANSIC++と同じです。それが正しいとあなたに言う人は誰でも間違っています。次に、foreachステートメントの質問に答えます。ISOC++仕様にはそのような記述はありません。Microsoftは、.Net Frameworkの一部として、C#の「foreach」ステートメントをサポートしています。その結果、これはVisual Studioでサポートされる可能性がありますが、使用しないことをお勧めします。

ユーザーshubhanshがいくつかの返信に答えたように、ベクターを使用してみてください。ただし、ハードコーディングするのではなく、一般的なサイズを使用したいと思います。次のforループは、この点で役立ちます。

    for(vector<int>::size_type i =0; i<myarray.size();i++)
{
total+=1;
}

これは、ISO規格で定義されているように、ベクトルを反復処理するのに最適な方法です。これがあなたの開発に役立つことを願っています。乾杯!

于 2012-07-23T07:52:02.423 に答える