libstdc++ std::list のイテレータのみで erase() を実行
最近 あまり日記を書いてないな.仕事で忙しい上に,気分の問題で外に出て運動もしてなかったからな.
STL std::list
に不満を抱いた.リストの要素の削除は,削除される要素の左右隣に閉じた操作であってリストのヘッドを参照する必要はないのに,どうしてヘッド・オブジェクトのメンバ関数としてのみ提供されているのか!?
GNU libstdc++
限定となってしまうが,コードを読んだら削除対象のイテレータのみで対応するノードを削除する方法を編み出すことができた.VC++ や libc++
は単に見てないが,内部メンバの名前が同じとは思えないからそのままでは動かないだろう... 名前だけの手直しで動く可能性もあるが,アクセス権とかが違うかも.
#include <iostream> #include <list> #include <string> #include <algorithm> using namespace std; typedef list<string> List; int main() { List lst{ string("a"), string("b"), string("c") }; auto it = lst.begin(); advance(it, 1); // _M_next->_M_prev = _M_prev; _M_prev->_M_next = _M_next; it._M_node->_M_unhook(); delete static_cast<_List_node<string> *>(it._M_node); for (auto &s : lst) cout << s << endl; }
もちろん,ちゃんと valgrind --leak-check=full
で確認してある.