std :: deque — индекс вне диапазона

Я пишу плагин для SA-MP, основанный на AMX, и возникла раздражающая проблема. Я использую deque и функцию, чтобы найти & удалить элемент. (как этот ниже)

enum PARAM_TYPE {
PARAM_TYPE_CELL,
PARAM_TYPE_ARRAY,
PARAM_TYPE_STRING,
};

struct params_s {
enum PARAM_TYPE type;
struct params_s * next;
cell free;
cell numData;
cell arrayData[0];
};

struct timer_s {
AMX * amx;
int id, func, interval, repeat;
long long unsigned int trigger;
struct params_s * params;
};

std::deque<struct timer_s *> gTimers;

void DestroyTimer(struct timer_s * t) {
for (int i = 0; i != gTimers.size(); ++i) {
if (t == gTimers[i]) {
gTimers.erase(gTimers.begin() + i);
break;
}
}
}

Всякий раз, когда я вызываю DestroyTimer (), я получаю эту ошибку:

Debug Assertion Failed!
Expression: deque subscript out of range

Я могу добавлять элементы, читать и изменять их, но не могу их удалить.

Спасибо.

1

Решение

Вы должны использовать стереть удалить идиома:

void DestroyTimer(struct timer_s * t)
{
gTimers.erase(remove(gTimers.begin(), gTimers.end(), t), gTimers.end());
}
2

Другие решения

Не смотря на фактическую ошибку, идиоматический способ будет:

gTimers.erase(std::remove(gTimers.begin(), gTimers.end(), t),
gTimers.end());

Это будет безопаснее и быстрее, чем то, что вы делаете сейчас (ловит
дубликаты, перераспределять не нужно).

Это называется Стереть-Удалить идиома.

Для фактического утверждения отладки: отладочные итераторы являются стандартными
расширение и может быть сломано в некоторых случаях.

NB: Вы хотите позвонить delete на таймере, если он принадлежит deque, чтобы предотвратить утечку памяти.

1

По вопросам рекламы [email protected]