1
const map<player, int>::iterator beginning = game->begin(); 
const map<player, int>::iterator inserted = game->find(player(x, y));
map<player, int>::iterator left = inserted;
while(left != beginning)
{
//some operations here
--left;
}

ご覧のとおり、マップを逆にループして、挿入したばかりの要素の前にあるすべての要素にアクセスします。問題は、上記の構造では最初の要素にアクセスできず、理由がわからないことです。何か提案はありますか?game-> begin()は最初の要素ですか?もしそうなら、それを解決する方法は?

4

4 に答える 4

2

game.begin()最初の要素へのイテレータです。

イテレータをに割り当てることにより、マップの最後から開始できます。rbegin

map<player, int>::reverse_iterator it = game.rbegin()

for (it = game.rbegin(); it != game.rend(); it++)
{
}
于 2013-03-24T00:28:28.397 に答える
2

rbegin()とを使用できますrend()

ここhttp://www.cplusplus.com/reference/map/map/rbegin/を参照してください。

于 2013-03-24T00:27:04.147 に答える
1

以下は、挿入されたばかりの要素(挿入されたばかりの要素を除く)の前のすべての要素にアクセスします。また、挿入された要素の前に要素がない状況からも保護します。

if (left != beginning) { 
    do {
        --left;
        //some operations here
    } while (left != beginning);
}
于 2013-03-24T00:29:15.087 に答える
1

ループの状態が間違っています。イテレータがであるときにループをスキップするように要求していますがbegin、その場合は実際にループを実行する必要があります。

実行できるさまざまなことがあります。コードへの影響を少なくするためには、ループを無限に変更し、イテレーターを変更する前に終了条件を追加することになるでしょう。

while (true) {
   // do something
   if (it == begin()) break;
   --it;
}

または、逆イテレータ(現在のイテレータで初期化できます)を使用して、に対してテストすることもできますrend()

于 2013-03-24T00:48:35.940 に答える