5

私はベクトルを扱っていますが、ある時点でNULLエントリがあります。指定されたベクトル内のすべてのNULLオカレンスを消去したいと思います。これまでの私のアプローチは機能していません:

for(int i = sent_flit_list->size() - 1; i >= 0; i--)
if(sent_flit_list[i] == NULL)
    sent_flit_list->erase(sent_flit_list[i]);

for(int i = sent_pkt_list->size() - 1; i >= 0; i--)
if(sent_pkt_list[i] == NULL)
    sent_pkt_list->erase(sent_pkt_list[i]);

どこ

vector<Flit*> *sent_flit_list;
vector<Packet*> *sent_pkt_list;

ベクトルです。タイプ(Flit *)NULL /(Flit *)0にキャストしようとしましたが、成功しませんでした。

どんな助けでも大歓迎です。

4

2 に答える 2

18

Erase-Removeイディオムを使用して、コンテナーから述語に基づいて要素を削除します。

あなたの場合:

// with a predicate
my_vec.erase(std::remove_if(begin(my_vec), end(my_vec), 
                           [](Flit* x) { return x == nullptr; }), 
             end(my_vec));

// with a value value
my_vec.erase(std::remove(begin(my_vec), end(my_vec), nullptr),
             end(my_vec));

vector :: Eraseは、格納されている型の値ではなく、ベクトルの要素に対するイテレータを期待しているため、現在のアプローチは機能していません。

率直に言って、あなたがしていることは少し奇妙に思えます。ポインタを格納するのではなく、値をコンテナに格納する必要があります。値が必要な場合は、などのクラスnullableを使用してください。Maybeboost::optional

于 2012-07-12T21:17:58.090 に答える
5

pmrを使用する必要があること、およびこれがコードの最も重要な間違いであることは絶対に正しいremoveですerase。ただし、報告するエラーメッセージを実際に引き起こしている間違いは次のとおりです。

変数sent_pkt_listsent_flit_listは、ベクトルではなく、ベクトルへのポインタです。したがって、のようなことを言うと、これはベクトルインデックスではなく、Cスタイルの配列インデックスを実行します。の値は(偽のポインタを効果的に逆参照しているため、間違いなく無意味です)であり、ではありません。それで、それをと比較しようとしますが、もちろん機能しません。sent_pkt_list[i]sent_pkt_list[i]vector<Packet*>Packet*NULL

于 2012-07-12T21:44:26.327 に答える