PDA

Просмотр полной версии : [Вопрос] Вопрос про foreach и for



DmitriyVasilev
02.02.2019, 18:03
Здравствуйте, подскажите, в каких случаях foreach лучше, а в каких лучше использовать for

x86
02.02.2019, 18:13
Foreach - это обертка над for для использования итераторов. Первый лучше использовать тогда, когда нужно использовать значения из диапазона [0,size) в упорядоченном виде. For для всех других случаев.

Пример:
У нас на сервере есть только 3 игрока с идентификаторами 3, 10, 204

foreach (new p : Player) {
printf("%d ", p);
}

Выведет: 3 10 204

Если бы мы использовали for, то нам пришлось бы всегда проверять занятость слота.

for (new i = 0; i < MAX_PLAYERS; ++i) {
if (!IsPlayerConnected(i))
continue;
printf("%d ", i);
}

Выведет тоже самое.

Различие лишь в том, что значения в первом примере записываются в итератор и не проверяются. Итератор - Player. На данном форуме есть статья про итераторы в Pawn (http://pro-pawn.ru/showthread.php?15081).

DmitriyVasilev
22.07.2019, 15:52
а можете пример показать где лучше for юзать

DeimoS
25.07.2019, 22:33
Везде, где нельзя применять foreach.

Пельмень
01.08.2019, 18:48
Можешь использовать foreach везде, только нужно создать свой итератор. Чекай тут (https://forum.sa-mp.com/showthread.php?t=571159)
Из гайда по Русски:

new Iterator:OwnedVehicles[MAX_PLAYERS]<MAX_VEHICLES>; //Создаешь массив

Iter_Init(OwnedVehicles); //Даешь понять, что это итератор в OnGameModeInit например

Iter_Add(OwnedVehicles[5], 5); //Добавляешь игроку с id 5 автомобиль с id 5

foreach (new i : OwnedVehicles[5]) //Парсишь id машин, которые находятся у игрока 5
По поводу "что лучше" - ничего.

DeimoS
02.08.2019, 11:42
Далеко не везде это будет уместно. Подробнее описал тут (http://pro-pawn.ru/showthread.php?15081-%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B-%D0%B2-Pawn&p=88314&viewfull=1#post88314) всю "проблему"