2012-01-18 78 views
1

我想使用remove_if删除我的向量中的元素做过滤。问题是当我编译代码时,没有错误,但是当我尝试使用过滤器函数时,出现错误,说我无法取消引用迭代器。我不知道什么是错的,希望你们能帮助发现问题。 这里是我的部分代码C++关于指针/参考与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"; 
    } 
} 

回答

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 documenation

适用预计值在区间[第一要素,最后一个),并删除那些为它不会返回false由此产生的范围。结果范围由函数返回的first和iterator之间的元素组成,该元素指向范围的新结尾。

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

总的来说这是一个好主意的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) 
    { 
    } 
+0

那么我还需要使用指针吗? – delphi316 2012-01-18 15:15:19

+0

请参阅我的编辑 – 2012-01-18 15:17:50

+0

这工作,但现在我有另一个问题。无论如何将remove_if变成像remove_ifnot之类的东西?我知道这听起来有点有趣...... – delphi316 2012-01-18 15:24:21

2

要真正删除元素,你需要做的是这样

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

remove_if只为您提供一个删除了元素的范围(新的结尾)。在你的代码中,你的ptr就是新的结尾(即最后一个有效元素的结尾)。

1

此行

ptr = &(*i); 

在序列的滤波部分的端部之后解除引用的元素。如果你的过滤器根本不匹配任何元素,所以没有任何东西被删除,那么你试图将一个迭代器解引用到一个超过向量的末尾,这会给你报告的错误。即使不是由i指出的元素的内容不可能是非常有用的。

这是不是一目了然你想ptr是,但我敢肯定这不是这个。

+0

我觉得你说得对;上面的代码只有在没有“被删除”的情况下才是错误的,否则它是非常有效的(尽管可能是不好的定制)将指针指向first * removed *元素。然而,如果没有东西被删除,那么正如你正确地指出的那样,这将需要对* one-past-last *元素进行解引用,这当然是无效的。 – bronekk 2012-01-18 16:07:24

+0

因为过滤选项是由系统给出的,它是从矢量中的对象中提取的 – delphi316 2012-01-18 16:42:54