うちの赤黒木のばあい
- やっぱり番兵に一難あるかも(例えばリンクポインタだけを partial construct)
- (ここで赤黒木なだけに色々あった.回転とか recoloring とか回転回転とか)
- (お,俺がんばったよね?もうゴールして良いよね?)
- comp( node_value, value_to_be_inserted ) を続けて最後だけ comp( value_to_be_inserted, node_value )
- 番兵は一番右下にぶら下げる(もちろん NULL かつ黒として扱う)のが良いよ〜な気がする.気がするだけ
- iterator::operator++ は「右の子へのポインタが NULL じゃなければ右へ下がるだけ.そうでなければ左の子から上がってくるような場所まで上がって,そこから右へ下りて以下最左へ下り続ける」
- iterator::operator-- は「左の子へのポインタが NULL じゃなければ左へ下がるだけ.そうでなければ右の子から上がってくるような場所まで上がって,そこから左へ下りて以下最右へ下り続ける」
- (ところで内容と全然関係ないけれど,このトラバースってホントに amortized O(1) なの?ー>各隣接ノードペア間をちょうど上下に2回ずつ移動するから,どんなときでも全体をトラバースするときのノード間の移動が 〜4N で amortized O(1) ってすぐに分かるじゃないかっ!!)
- そうすると,「右下に ぶら下げてて良かった sentry (字余り)」
うちの std::deque のばあい
- std::deque< int > d( 10, 0 ); // やっぱり Boost.TypeTraits ですよ
- circular buffer を使うと indexing の調整がちょー面倒.マジ面倒
- insert ちょーやヴぁい.マジやヴぁい. copy と copy_backward の使い分けかなーりやヴぁい.オブジェクト構築済みの部分とオブジェクト未構築部分の区別心底やヴぁい.効率考えると場合分けやヴぁい
うちの slist のばあい
- slist< int > l( 10, 0 ); // 持ってて良かった Boost.TypeTraits
- 一つ前のノードに行くっちゅー操作はちょー重要
- やはり番兵(あるいは: boost::aligned_storage)
- うがー!!一つ前のノードに行きてー!!
- またしても多分 splice
- 一つ前は何ですか〜♪見つけにくいものですか〜♪一つ前に,一つ前に,行ってみたいと思いませんかぁ〜♪うふっふ〜♪
- 従って insert/erase の複雑さはどうあがいても O(N) ですからね?そりゃ標準に入れるの躊躇するっちゅーねん