c++ - std::deque - 下标超出范围

标签 c++ std deque

我正在为基于 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()); 
}

关于c++ - std::deque - 下标超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12896069/

相关文章:

c++ - 如何: Threading on windows platform (C++)

c++ - MFC C++ 奇怪的问题

c++ - 如何用 std vector 初始化 std 堆栈?

c++ - 读取格式不正确的文件时应该抛出什么类型的 std::exception?

c++ - 如何使用指针从双端队列中删除特定元素

c++ - 编译器如何实现位域运算?

c++ - 为每个函数和自由函数 boost mpl

c++ - 设置 QLineEdit 时的 std::out_of_range

c++ - 对双端队列中的迭代器失效感到困惑

C++:如何正确地将 deque::front() 返回的变量传递出函数?