2016-05-12 10 views
0

私は以下のクラスを持っています。静的メンバー_listは、クラスのすべてのインスタンスによって共有され、Class_f()の範囲内で作成されます。私は_listの最後の要素を消去するために消去機能を使用したいと思います。クラスリストの静的メンバーの要素を消去する

class myClass 
{ 
    private: 
     static list<int> _list; 
    public: 
     //constructors,destructors 
     void Class_f(); 
} 

list<int> myCLass::_list; 

void myClass::Class_f() 
{ 
    //..some code 
    list<int>::iterator it1; 
    it1=_list.end(); //erase for instance the last element _list 
    it1=_list.erase(it1); 
    //more code 
} 

しかし、コンパイルすると、 "list iterator not incrementable"というメッセージが表示されてエラーが表示されます。どうしてこのエラーが出るのですか?さらに、イテレータの作成を避けるため、_list.erase(_list.end())のような簡単なものを使用できないのはなぜですか?

+0

'_list.rbegin()'リストの最後の要素でなければなりません。 –

答えて

5

_list.end()は、最後の要素のイテレータではありません。これは、1つの過去のイテレータです。あなたは本当にそれで何かをすることはできません。 C++'s iterator ranges are half-open

実際にコンパイラエラーが表示された場合は、間違っています。

デバッグモードでの標準ライブラリの実装で、返り値の準備中に発生する_list.end()(これは未定義の動作)をインクリメントする試みが非常に親切に検出された、ランタイムからのデバッガメッセージが表示される可能性があります。 _list.erase(it1)とあなたにそのようなdoofusではないと言った。 :)

+0

申し訳ありませんが、私は "デバッガのメッセージ"を意味する必要があります。とにかく、エラーは正確にリストのサイズを超えた要素にアクセスすることから来ます。どのようにして最後の要素にアクセスできますか? –

+0

@SrIncerteza:インターネットにアクセスできなくなりましたか?見つけ出すために 'std :: list'のドキュメントを読むことができます。他の答えはあなたにも使い方を教えてくれました(私は自分で発見するために少しでも何かを残すことを好みます)。 –

4

まず、list.end()は、「過去の要素を参照するイテレータ」を提供します。したがって、erase(list.end())を呼び出すことはできません。

第2に、list.pop_back()を使用して最後の要素を削除します。 List.pop_back()

関連する問題