C++关于带有remove_if的指针/引用



我正试图使用remove_if来删除向量中的元素以进行过滤。问题是,当我编译代码时,没有错误,但当我尝试使用filter函数时,错误弹出,说我不能取消引用迭代器。我不知道出了什么问题,希望你们能帮我找出问题所在。这是我的部分代码

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 << "tt";
        ptr->getLocation();
        cout << "n";
     }
}

要真正擦除元素,需要执行类似的操作

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

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

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的元素。结果范围由函数返回的第一个和迭代器之间的元素组成,迭代器指向范围的新末端。

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

一般来说,在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)
    {
    }

此行

ptr = &(*i);

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

目前还不清楚你想要ptr是什么,但我敢肯定不是这样。

最新更新