1

我正在尝试使用 remove_if 删除向量中的元素以进行过滤。问题是当我编译编码时,没有错误,但是当我尝试使用过滤器功能时,弹出错误说我无法取消引用迭代器。我不知道哪里出了问题,希望你们能帮助发现问题。这是我的部分代码

bool filter_C (Teacher &t) 
{ 
return (t.getCat() != compare); //compare is a static string
}
void filterTeacherCategory(vector<Teacher> &t)
{
    vector<Teacher>::iterator i;
    Teacher *ptr;
    i = remove_if(t.begin(), t.end(), filter_C);
    ptr = &(*i);
    for (i = t.begin(); i != t.end(); ++i)
    {
        ptr->getName();
        cout << "\t";
        ptr->getGender();
        cout << "\t";
        ptr->getPhone();
        cout << "\t";
        ptr->getCategory();
        cout << "\t\t";
        ptr->getLocation();
        cout << "\n";
     }
}
4

3 回答 3

2

要实际擦除元素,您需要执行类似的操作

t.erase(std::remove_if(...),t.end());

remove_if只为您提供删除元素的范围(新端)。而在您的代码中,您ptr正是新的结束(即,超过最后一个有效元素)。

于 2012-01-18T15:14:43.533 回答
1

remove_if 返回向量的新端。所以你应该像这样迭代

vector<Teacher>::iterator i;
vector<Teacher>::iterator newenditer = remove_if(..);


for (i = t.begin(); i != newenditer ; ++i)
{
       Teacher& tchr= *i;
       cout << tchr.getName() << "\n";
       cout << tchr.getPhone() << "\n";

}

remove_if文档

将 pred 应用于范围 [first,last) 中的元素,并从结果范围中删除不返回 false 的元素。结果范围由 first 和函数返回的迭代器之间的元素组成,该迭代器指向范围的新端。

保留未删除元素的相对顺序,而超出新范围的元素仍然有效,尽管具有未指定的值。

一般来说,在 remove_if 之后擦除剩余元素是个好主意

vector<Teacher>::iterator i;
vector<Teacher>::iterator newenditer = remove_if(..);
t.erase( newenditer , t.end() );

现在 t.begin() 和 t.end() 之间的所有内容都是有效且良好的,因此您可以这样做

 for (i = t.begin(); i != t.end() ; ++i)
    {
    }
于 2012-01-18T15:13:05.553 回答
1

这条线

ptr = &(*i);

在序列的过滤部分结束后取消引用元素。如果您的过滤器根本不匹配任何元素,因此没有删除任何内容,那么您正在尝试将迭代器取消引用到向量末尾之后的一个,这将给出您报告的错误。即使不是指向的元素的内容i也不太可能很有帮助。

完全不清楚你想ptr成为什么,但我很确定不是这个。

于 2012-01-18T15:18:06.077 回答