std コンテナーの消去関数のパラメーターの型 (質問に記載されているように、つまり、ベクター、リスト、deque からのものかどうかなど) は常に、このコンテナーの iterator onlyです。
この関数は、最初に指定された反復子を使用して、この反復子が指す要素とそれに続く要素をコンテナーから除外します。1 つの反復子に対して 1 つの要素のみを消去するコンテナーもあれば、1 つの反復子 (この反復子が指す要素を含む) に続くすべての要素をコンテナーの末尾まで消去するコンテナーもあります。消去関数が 2 つの反復子を受け取った場合、各反復子が指す 2 つの要素がコンテナーから消去され、それらの間の残りの要素もすべてコンテナーから消去されます。 std コンテナの関数は無効になります! また:
コンテナーから消去された要素を指していた各イテレーターは無効になりますが、コンテナーの末尾を通過しません!
つまり、コンテナーから消去された要素を指していたイテレーターは、container.end() と比較できません。このイテレータは無効なので、逆参照できません。つまり、* 演算子も -> 演算子も使用できません。インクリメントもできません。つまり、++ 演算子も使用できません。デクリメントもできません。つまり、オペレーター。
それも比較にならない!!! IE では、== 演算子も != 演算子も使用できません。
実際には、標準反復子で宣言および定義されている演算子は使用できません。null ポインターなど、この反復子では何もできません。
無効な反復子で何かを行うと、プログラムがすぐに停止し、プログラムがクラッシュしてアサーション ダイアログ ウィンドウが表示されることさえあります。どのオプションを選択しても、どのボタンをクリックしても、プログラムを続行する方法はありません。[中止] ボタンをクリックするだけで、プログラムとプロセスを終了できます。
コンテナの先頭に設定するか、単に無視しない限り、無効なイテレータに対して他に何もする必要はありません。
しかし、イテレータをどうするかを決める前に、使用しているコンテナの消去関数を呼び出す場合、まずこのイテレータが無効かどうかを知る必要があります。
与えられた反復子が無効かどうかをチェックし、テストし、認識し、true を返す関数を自分で作成しました。memcpy 関数を使用して、任意のオブジェクト、アイテム、構造、クラスなどの状態を取得できます。もちろん、最初は常に memset 関数を使用して、新しいバッファー、構造、クラス、または任意のオブジェクトまたはアイテムをクリアまたは空にします。 :
bool IsNull(list<int>::iterator& i) //In your example, you have used list<int>, but if your container is not list, then you have to change this parameter to the type of the container you are using, if it is either a vector or deque, and also the type of the element inside the container if necessary.
{
byte buffer[sizeof(i)];
memset(buffer, 0, sizeof(i));
memcpy(buffer, &i, sizeof(i));
return *buffer == 0; //I found that the size of any iterator is 12 bytes long. I also found that if the first byte of the iterator that I copy to the buffer is zero, then the iterator is invalid. Otherwise it is valid. I like to call invalid iterators also as "null iterators".
}
そこに投稿する前にこの機能をテストしたところ、この機能が機能していることがわかりました。
私はあなたの質問に完全に答え、またあなたを大いに助けたことを願っています!