C# でコピーコンストラクタを書いてて、 Stack の複製の落とし穴に嵌ったのでメモ。
下記のコード、一見何も問題ないように思いますよね?
Stack<T> CopyStack<T>(Stack<T> from){
return new Stack<T>(from);
}
でも、実はこうすると中身が逆順になってしまうんです。
fromの中身が [1,2,3] だと、複製したスタックは [3,2,1]になっちゃいます。
正しく複製するには、引数を逆転させないといけなかった。
Stack<T> CopyStack<T>(Stack<T> from){
return new Stack<T>(from.Reverse());
}
Stack のコンストラクタに Stack を渡すと IEnumerable に変換されますが、
この時の変換処理は、順次 Pop して取り出していく実装になってます。
ところが、コンストラクタでは IEnumerable から取り出した順に Push していく実装になってます。
このミスマッチによって中身の逆転した Stack が生成されてしまうようです。
[1,2,3] >> []
[1,2] >> [3]
[1] >> [3,2]
[] >> [3,2,1]