Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

コミケで受けていた通販をすべて発送しました。詳しくはこちらの記事にて
C++とかC#とか数学ネタを投下していく予定です。
それ以外の日々の四方山話を綴った日記はこちら

書庫

日記カテゴリ

[C++]リストカット(メモリ的な意味で)

ネタ元>[C++] C++0x forward_list

C++0xに単方向リストが実装されるという話なのですが、
その際、size()が実装されないということらしいです。
理由として、size()を持つメンバ変数領域が無駄だそうで。

これは100歩譲って認めるとしても、push_back()も実装されないそうです。
単方向なのでend()からは辿ることができないから無理もないのですが、
size()のメンバ変数を持つことを嫌う人が、
push_back()のためにbefore_endをメンバ変数にもつとは思えません。

となると、push_front()を主に使ってプログラムを組むことになるのですが、
今までのSTLのコンテナがpush_back()を中心に作られている上、
先頭から物が詰め込まれるというのはなかなか使い勝手が悪く思えます。

そうなると、この辺を実装したrich_flistが欲しいわけですが、どうやって作るか問題です。
ですが、デストラクタにvirtualが付いていませんので、これでは派生はできません。
virtualをつけてしまうとvfptrが付いてしまうため、size()のメンバ変数を嫌う…(以下略)

となると、所有で解決するか、一から作り直すことになるでしょう。
どちらにしろ、forward_listとrich_flistの両方を受け入れる関数を作るには
テンプレートを使ったプログラムが必要になります。

もっとも、forward_listの発端がメモリの節約なので、
メモリ消費量が増える機能拡張はなし、というのはわかるのですが…。

要素毎に逆方向ポインタがつくのは嫌だけど、size()やpush_back()は使いたい、
そういうニーズをうまく解消する方法はないものですかねぇ。

#そこで、マジックリストを標準ライブラリに!!

投稿日時 : 2008年9月8日 1:39

Feedback

# re: [C++]リストカット(メモリ的な意味で) 2008/09/08 9:11 長月葵

 本筋と関係ないですけどbefourじゃなくてbeforeだと思いました。

# re: [C++]リストカット(メモリ的な意味で) 2008/09/08 9:55 melt

必要なら、最後尾のイテレータ覚えておいて insert_after 使えばいいんじゃ?

# re: [C++]リストカット(メモリ的な意味で) 2008/09/08 11:21 アキラ

どうしても使いたい場合の方法はありますよ。

list<int> ls;

// size
size_t n = distance(ls.begin(), ls.end());

// push_back
ls.insert(ls.end(), 3);


> 今までのSTLのコンテナがpush_back()を中心に作られている
そんなことはないです。
STLコンテナの要件にpush_backはありません。
シーケンスコンテナだからといって、push_backを持っている必要はありません。

# re: [C++]リストカット(メモリ的な意味で) 2008/09/08 11:22 アキラ

間違い
× insert
○ insert_after

# re: [C++]リストカット(メモリ的な意味で) 2008/09/08 11:41 アキラ

ちなみに、SGIのslistもSTLportのslistもpush_backは持っていないです
(sizeはあるけど)

# re: [C++]リストカット(メモリ的な意味で) 2008/09/08 11:55 zak

ん?

// push_back
ls.insert_after( boost::prior(ls.end()), 3);

ではなかとでしょうか?KY?

# re: [C++]リストカット(メモリ的な意味で) 2008/09/08 12:20 アキラ

insert_afterにendを渡した場合は最後尾への追加になるそうです

# re: [C++]リストカット(メモリ的な意味で) 2008/09/08 21:30 出水

>befour
ぎゃーす、見なかったことに!!

>boost::prior(ls.end())
九分九厘無理

標準ライブラリなら、出来るだけ尖ってないものが欲しいと思うんですよ。
自作のslistはO(1)のpush_back()あるのに、標準ライブラリにはないの?と不思議に思います。
外部ライブラリであれば、文句はないのですが。

# re: [C++]リストカット(メモリ的な意味で) 2008/09/08 21:48 アキラ

実装があるなら提案してみればいいです。
えっと、どこに書けばいいんだろ

comp.lang.c++ かな

# re: [C++]リストカット(メモリ的な意味で) 2008/09/09 9:57 zak

>九分九厘無理
あー。forward_list が bidirectional じゃない事は承知の上です。

ls.insert_after(ls.end(), 3);
で挿入可能ならO(1)で済みそうですが、
ls.insert_after( boost::prior(ls.end()), 3);
(意味的に)こちらで挿入するならO(N)以上かかるなーと。

# re: [C++]リストカット(メモリ的な意味で) 2008/09/09 11:44 アキラ

> list<int> ls;
おっと、listになってた。
forward_listの間違いです。

タイトル  
名前  
Url
コメント