2012-01-18 29 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

は)[最初、最後の範囲内の要素にpredを適用し、それがからfalseを返しません。そのため、それらを削除しますように反復されなければなりません結果の範囲。結果の範囲は、firstと関数によって返されるイテレータの間の要素で構成され、範囲の新しい終わりを指します。

削除されない要素の相対的な順序は保持されますが、範囲の新しい終わりを過ぎた要素はまだ有効ですが、指定されていない値でも有効です。一般的に

今t.begin間のすべてのもの()とt.endは()することができますので、すべて有効と良いですremove_if

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

た後、残りの要素を消去することは良いアイデアです実際の要素を消去する

for (i = t.begin(); i != t.end() ; ++i) 
    { 
    } 
+0

私はまだポインタを使用する必要がありますか? – delphi316

+0

私の編集 –

+0

をご覧ください。これはうまくいきましたが、もう別の問題があります。 remove_ifをremove_ifnotのようなものに変換する方法はありますか?私はこの音がちょっと面白いと知っています... – delphi316

2

を行い、あなたは

t.erase(std::remove_if(...),t.end()); 
ような何かをする必要があります

remove_ifは、要素が削除された範囲(新端)のみを提供します。あなたのコードでは、ptrはちょうど新しい終わりです(つまり、最後の有効な要素を超えたもの)。

1

このライン

ptr = &(*i); 

配列の濾過部分の終了後の要素を逆参照されます。フィルタに要素が一切含まれていないため、何も削除されなかった場合は、イテレータをベクターの末尾まで参照解除しようとしています。これにより、エラーが報告されます。そして、たとえそうでなくても、iが指し示す要素の内容はあまり役に立たないようです。

ptrが欲しいとはっきりしていませんが、これはこれではないと確信しています。

+0

あなたはそれが正しいと思います。上記のコードは、何も "削除"されていない場合にのみ間違っています。そうでない場合は、ポインタを最初に削除した要素に完全に有効です。しかし、何も削除されなかった場合は、正しいことを指摘すると、当然有効ではない1つ前の最後の要素の逆参照が必要になります。 – bronekk

+0

フィルタリングオプションは、ベクトル内のオブジェクトから取得されるシステムによって与えられるため – delphi316

関連する問題