3

構造体を反復処理することは可能ですか?

例えば

struct team{
   int player1;
   int player2;
   int player3;
   int player4;
   ...
   int player99; 
   int size = 99;
}

次に、forループを実行してfoo 1-4を設定またはアクセスしますか?

擬似コードは次のようになります

for(int i = 0; i < size; i++){
    player i = (i+1); 
 }

それが意味をなさない場合のより簡単な説明は、player1=1をハードコーディングせずに各変数を調べられるようにしたいだけです。player2=2。

4

4 に答える 4

5

1 つの方法は、プレーヤー/要素を配列に入れることです。

struct Team {
    static int const size = 99;
    int players[size];
};

その後:

for(int i = 0; i < size; ++i)
    int player = players[i];
于 2012-11-01T17:00:56.983 に答える
2

あなたが尋ねたようにあなたの質問に答えるために、プリコンパイラマクロ Pack (正確なフレーズはコンパイラによって異なります) を使用して、構造体のインスタンスを作成するために使用されるメモリの構造を保証できると思います。そして、技術的には、ポインターをインクリメントして移動することができます...怒っている場合。これは非常に貧弱な方法であり、異なるコンパイラーや異なる曜日でさえ動作することが保証されていません。いいえ、あなたが望むのは、あなたのために仕事をするためのデータ構造です。100%キャッシュバック保証付き!

これを行うための最も基本的な構造は、固定サイズの配列です。次に例を示します。

struct team
{
    int players[99]; //an array
    int manager;
    int coach;
    string teamName;
    //etc etc
}

次に、プレーヤーにアクセスします

team myTeam;
for(int i(0); i < 99; ++i)
{
    myTeam.players[i]; //do whatever
}

配列の制限は、作成後にサイズを変更できないことです。だから試したら

myTeam.players[99]; //accessing invalid memory - the array values are 0 - 98

より高度な

作成後にサイズを変更できるデータ構造が必要な場合、たとえば、将来のある時点でチームにさらに数人のプレーヤーを追加することが必要になる場合があります。次に、 std::vectorstd::dequestd::listなどの動的データ構造を使用できます。

于 2012-11-01T17:04:15.500 に答える
1

メンバー関数へのポインターのように、メンバーへのポインターを定義できます。

  typedef int team::*member_t;

すべてのメンバーへのポインタの配列を持つことができます:

  static member_t member[size];

このアプローチでは、メンバー関数を定義してすべてのメンバーを反復処理するのは簡単です。

  template <class F>
  void for_each(F f)
  {
     for (int i = 0; i < size; ++i)
       f(this->*member[i]);
  }

また、プリプロセッサ マクロを使用すると、すべてのメンバーを 1 か所で定義し、メンバーへのポインターを別の定義で定義できるため、順序を変更しても間違いはありません。完全なコードを参照してください:

struct team {
#define TEAM_MEMBERS(prefix,suffix) \
  prefix player1 suffix, \
  prefix player2 suffix, \
  prefix player3 suffix

  int TEAM_MEMBERS(,);
  static const int size = 3;
  typedef int team::*member_t;
  static member_t member[size];
  template <class F>
  void for_each(F f)
  {
     for (int i = 0; i < size; ++i)
       f(this->*member[i]);
  }
};
team::member_t team::member[team::size] = {
  TEAM_MEMBERS(&team::,)
};

そしていくつかのテスト:

#include <iostream>

int main() {
  team t = { 0 };
  t.for_each([](int m) { std::cout << m << "\n"; }); // prints 0,0,0
  int n = 0;
  t.for_each([&n](int& m) { m = n++; });
  t.for_each([](int m) { std::cout << m << "\n"; }); // prints 0,1,2
  t.player2 = 7;
  t.for_each([](int m) { std::cout << m << "\n"; }); // prints 0,7,2
}
于 2012-11-01T17:43:59.433 に答える
1

std::arrayたとえば、またはを使用できますstd::vector。このようにして、反復するのは簡単になり、コピーを作成するのがはるかに簡単になります。ただし、設計の観点からも優れています。プレーヤーの数を変更する場合は、多くのフィールドを追加/削除するよりもコンテナーを変更する方がはるかに簡単です。

于 2012-11-01T16:59:51.330 に答える