我有两个 vector<T>
在我的程序中,称为 active
和 non_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/