4

だから、私はこれを得ました:

struct People_Info {
  bool isWorking;
  std::string name;
  int age;
  float height;
};
int counter = 0;
int random = urand(1, 4);
std::map<uin64, People_Info> PeopleMap;

ここで、いくつかのデフォルト値を設定するこの構造体を使用してマップにエントリを作成する関数が呼び出されます。

PeopleMap[counter].isWorking = false;
PeopleMap[counter].name = "Mr";
PeopleMap[counter].age = 1;
PeopleMap[counter].height = 1.60f;
counter++;

さて、これは新しい人のためにエントリを作成する関数ですが、スクリプト全体でいくつかのエントリを削除します。したがって、5 つの要素を取得し、たとえば 2 番目の要素を削除すると、いくつかの変数を編集したいと思います。マップ内の全員:

for(int i = 0; i < 5 ; i++) {
  if(PeopleMap[i] == PeopleMap.end())  // Don't edit map entries that are erased
    continue;

  PeopleMap[i].isWorking = true;
}

さて、何らかの理由でまだすべてのエントリを編集していますが、new を使用してすべてのエントリの構造体を作成する必要がありますか?

4

3 に答える 3

2

PeopleMap.end()有効な引数を返さない、ゴースト ノードのようなものです。

たとえば、マップで反復する方法は次のようになります。

for(std::map<uin64, People_Info>::iterator it = PeopleMap.begin();it != PeopleMap.end() ;it++)

ほらPeobleMap、最後のゴーストノードのようなものは、あなたが最後に到達したことを示しています. 前forの で、マップ値にアクセスしたい場合は、次のようにすることができます。

it->first // uint64
it->second.isWorking

したがって、イテレータを使用すると、消去された値を確認する必要がなくなり、マップ内の各ペアのパラメータを編集できるようになります (キーが少ない)。

于 2012-12-02T19:15:41.637 に答える
1

添え字演算子を使用してマップ内のまだ存在しないキーにアクセスすると、対応する要素が挿入されます。オブジェクトが以前に消去されたかどうかは重要ではありません。オブジェクトが存在しない場合でも挿入されます。

マップ内のすべての要素にアクセスするには、キーを使用せずに、マップに対して反復子を使用します。このようにして、新しい要素は挿入されません。

于 2012-12-02T18:45:43.753 に答える
0

以下は正しくありません。

if(PeopleMap[i] == PeopleMap.end())

あなたはおそらく言うつもりだった

if(PeopleMap.find(i) == PeopleMap.end())
于 2012-12-02T18:29:57.237 に答える