2016-11-17 1 views
-4
ここ

の最初の項目を削除することは私のタイプでありますそれをしないでください。私はイテレータのオーバーロードを行う必要があるように見えます。ベクトル

私の構造体のイテレータのオーバーロードについてお勧めしますか?

+2

どのようなエラーが表示されますか? – stark

+1

は不可能です。私のベクトルはpop_frontを持っていません。ベクトルまたはカスタム構造体です。 –

+0

可能でなければならないので、何か他のことが起こっています。 – acraig5075

答えて

3

&まさにあなたが提案したものです。

イテレータのオーバーロードを行う必要があります。

std::vectorの最初の要素を消去するためにイテレータをオーバーロードする必要はありません。


P.S.正面から消去する場合は、ベクター(動的配列)がデータ構造の選択肢として誤っている可能性があります。

+0

std :: vector があり、単にポインタを削除しているインデックスの1つを消去した場合、正しいですか?メモリリークを止めるには、そのポインタを持たなければならないか、 "delete topPriorityRules [0];" "topPriorityRules.erase(topPriorityRules.begin());"、そうですか? –

+0

@ブラッドB。ポインタが動的に割り当てられたオブジェクトを指していて、ポインタがそのオブジェクトを所有している場合は、ポインタを削除する前にオブジェクトを削除する必要があります。メモリを所有する裸のポインタを使うのは悪い考えです。 – user2079303

2

つの提案:

  1. 利用std::dequeの代わりに、あなたの特定のケースでのパフォーマンス向上のためstd::vectorおよび方法std::deque::pop_front()を使用します。
  2. 再考(I意味:削除)参照ベクトルの最初の要素を除去するための正しい方法である

    topPriorityRules.erase(topPriorityRules.begin()); 
    

    ある

    std::vector<Rule>& topPriorityRules; 
    

    考えるstd::vector<ScanRule>& topPriorityRules;

+0

なぜ私は自分のベクターのpop_frontを取得していないのですか? –

+0

明らかに、標準では実装されていません。[link](http://www.cplusplus.com/reference/vector/vector/?kw=vector)または[link](http://en.cppreference.com/w/cpp/container/vector)。その理由は '.pop_front()'メンバ関数はほぼ同じ量のメモリ(安定性の問題でもある)を割り当てなければならず、残りの部分をコピーしなければならないので、 'std :: vector'にとって非常に非効率的である。 'deque'は' pop_front() 'が必要な状況のために設計されています。実際には、インデックスによるランダムアクセスが必要ない場合にも、 'std :: list'も役に立ちます。 – VCSEL