我正在为基于AMX的SA-MP编写插件,并且发生了一个令人讨厌的问题。我正在使用双端队列和函数来查找和删除元素。 (如下所示)

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

我可以添加元素,读取和修改它们,但不能删除它们。

谢谢。

最佳答案

您应该使用erase remove idiom:

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

09-10 00:07