2013-03-24 2 views
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() первым элементом? Если да, то как его решить?STL петля в обратном направлении через карту C++

+0

Что вы подразумеваете под "не имеет доступа"? Здесь, когда 'left == begin', вы не вводите цикл' while', поэтому, очевидно, он не обрабатывается –

ответ

1

Ниже будет доступ ко всем элементам до того, только что вставили (не включая только что установлена). Она также защищает от ситуации, когда нет никаких элементов «до» вставленного элемента:

if (left != beginning) { 
    do { 
     --left; 
     //some operations here 
    } while (left != beginning); 
} 
+0

Я пробовал это, но когда я запускаю программу: «Expression: map/set iterator not dereferencable» – 2013-03-24 00:36:56

+0

Да, это не является надежным перед лицом 'game-> find (player (x, y))' возвращает элемент в начале. Я сделал небольшое изменение, чтобы сделать так. –

+0

Ты прекрасна! Большое спасибо, работая как намеренный :) – 2013-03-24 00:51:59

2

game.begin() Итератор для первого элемента.

вы можете начать с конца карты путем присвоения итератор rbegin

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

for (it = game.rbegin(); it != game.rend(); it++) 
{ 
} 
+0

@Tushar. Итератору должно быть reverse_iterator – taocp

+0

Спасибо! Это работает, но мне действительно нужно начинать только что вставленную форму, потому что карта довольно большая, и это занимает много времени, чтобы зацикливать все элементы, начиная с конца. – 2013-03-24 00:42:18

1

условия в цикле является неправильным. Вы просите пропустить цикл, когда итератор равен begin, но вы действительно хотите его выполнить в этом случае.

Есть разные вещи, которые вы можете сделать, тот, который будет вызывать меньшее влияние на ваш код, вероятно, будет меняться цикл будет бесконечным и добавляя условие выхода перед изменением итератора:

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

В качестве альтернативы вы можете использовать обратные итераторы (которые вы можете инициализировать с помощью текущего итератора) и протестировать против rend().

Смежные вопросы