c++ - 我的 vector<T>::erase 这里有什么问题?

标签 c++ vector erase

我有两个 vector<T>在我的程序中,称为 activenon_active分别。这是指它包含的对象,至于它们是否在使用中。

我有一些循环 active 的代码 vector 并检查可能已变为非事件状态的任何对象。我将这些添加到 temp_list在循环内。

然后循环之后,我使用我的temp_list并做 non_active.insert temp_list 中的所有元素.

在那之后,我会调用 erase在我的 active vector 并将其传递给temp_list删除。

然而,出于某种原因,erase崩溃。

这是代码:

non_active.insert(non_active.begin(), temp_list.begin(), temp_list.end());
active.erase(temp_list.begin(), temp_list.end());

我得到这个断言:

Expression:("_Pvector == NULL || (((_Myvec*)_Pvector)->_Myfirst <= _Ptr && _Ptr <= ((_Myvect*)_Pvector)->_Mylast)",0)

我在网上看过,发现有一个删除-删除习语,但不确定如何将其应用于从 vector<T> 中删除一系列元素。

我没有使用 C++11。

最佳答案

erase 期望传递给它的一系列迭代器位于当前 vector 内。您不能将从不同 vector 获得的迭代器传递给 erase

这是一个可能但效率低下的 lambda 支持的 C++11 解决方案:

active.erase(std::remove_if(active.begin(), active.end(), [](const T& x)
{
    return std::find(temp_list.begin(), temp_list.end(), x) != temp_list.end();
}), active.end());

下面是没有 lambda 的等效 C++03 解决方案:

template<typename Container>
class element_of
{
    Container& container;

    element_of(Container& container) : container(container) {}

public:

    template<typename T>
    bool operator()(const T& x) const
    {
        return std::find(container.begin(), container.end(), x)
            != container.end();
    }
};

// ...

active.erase(std::remove_if(active.begin(), active.end(),
                            element_of<std::vector<T> >(temp_list)),
             active.end());

如果将 temp_list 替换为 std::set 并将 std::find_if 替换为 find集合上的成员函数调用,性能应该可以接受。

关于c++ - 我的 vector<T>::erase 这里有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9097138/

相关文章:

c++ - 需要修复我的 Variadic 宏

返回不可变指针 vector 的函数的 C++ 语法

c++ - 存储指向类对象的指针地址的最佳方法

c++ - 以下结合了 erase 和 remove 的语法是什么意思?

c++ - 是否允许编译器像带有 -O2 的英特尔 C++ 编译器那样删除无限循环?

c++ - 创建 mwArray 的问题

C++ 无输出,boost.asio

c++ - 如何使 vector 的元素独一无二? (删除不相邻的重复项)

c++ - 使用删除和插入替换 vector 中的元素

c++ - 导致段错误的独立列表之间的插入/删除语句的顺序