我正试图使用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
是什么,但我敢肯定不是这样。