【C++】STL(Standard Template Library)相談室 6

このエントリーをはてなブックマークに追加
937デフォルトの名無しさん:2007/07/17(火) 00:14:21
ごめん、resizeだった。
938デフォルトの名無しさん:2007/07/17(火) 00:18:01
>>935
std::vector::data() を待て。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#464

と思ったら libstdc++ にはもう入ってるな。
939デフォルトの名無しさん:2007/07/17(火) 01:09:56
>>938
!!! チェックしてなかったわちょーさんくす「
940デフォルトの名無しさん:2007/07/17(火) 10:48:33
>>933
vector<boost> の特殊化を消すって?
特定のクラスを引数に取ったときだけ
クラステンプレートの特殊化を禁止するなんてことできるの?
なんか俺根本的にテンプレートを理解してない?
941デフォルトの名無しさん:2007/07/17(火) 10:49:53
>>940
仕様から取り除くって話だと思われ。
942デフォルトの名無しさん:2007/07/17(火) 10:51:09
そもそもvector<boost>の時点で>>940は何かがおかしい。
943デフォルトの名無しさん:2007/07/17(火) 10:52:24
>そもそもvector<boost>の時点で>>940は何かがおかしい。
そりゃぁ、>940の頭だろ。
944デフォルトの名無しさん:2007/07/17(火) 11:15:34
今更仕様から取り除くことはできないな。
利用してるプログラムが軒並みアウトになっちまう。

bool と全く同じように扱えるクラス __bool を標準で提供して、
vector<__bool> とできるようにするとかなら可能。
945デフォルトの名無しさん:2007/07/17(火) 12:43:40
sstreamみたいに段階を経て亡き物とする方法も。
946デフォルトの名無しさん:2007/07/17(火) 13:32:37
名前が変わったんだっけ?
947デフォルトの名無しさん:2007/07/17(火) 13:35:01
vector<bool> の代わりとなるクラスを作って、
今まで vector<bool> としてあったところをそれで置換してもらう、
っつー形に強引にすることはできんのかね。
948デフォルトの名無しさん:2007/07/17(火) 17:53:33
list と vector を 使って sort 以外同じ書き方でできるの内容のプログラムなので
切り替えて使っているのですが、sort を使いたくて困りました。

sort も使いたいのでコンパパイル時に切り替えたいのですが;
自前の #define を使ってではなく、その変数が、list か vector かによって
条件コンパイルする方法はないでしょうか?

実行時では、sort 部分がコンパイルエラーになるので間に合いません。
949デフォルトの名無しさん:2007/07/17(火) 17:58:01
なんだかよく分からんがオーバーロードを駆使して解決できそう
950デフォルトの名無しさん:2007/07/17(火) 18:07:44
イテレータのトレイトに対してオーバーロードされたテンプレート関数を作る。
std::advance関数の実装が参考になるよ。
951デフォルトの名無しさん:2007/07/17(火) 18:24:07
コンテナのイテレータがランダムアクセスイテレータならstd::sortが使えて、
両進イテレータならメンバ関数のsortが用意されていることを期待するわけだ。
C++はこういう見えにくいインターフェースを多用するから困る。
952デフォルトの名無しさん:2007/07/17(火) 18:33:29
そのためにコンテナのイテレータのタイプに合わせて
コンパイル時にどちらを使うか決定してくれる奴があったと思うけど・・・
953デフォルトの名無しさん:2007/07/17(火) 18:40:01
そんな便利な記法STLにあったっけ
がりがりオーバーロード書いてたよ。
今からリファレンス読み返してくるorz
954デフォルトの名無しさん:2007/07/17(火) 19:00:36
boost::sortはenable_ifを使って
渡されたコンテナにメンバとしてsort()が定義されている場合はそれを使い
定義されていない場合はsortアルゴリズムを使うように定義されてるみたい
というわけでこれを使うのが楽っぽい?
955デフォルトの名無しさん:2007/07/17(火) 19:25:30
>>951
そこでコンセプトですよ。
今までただの文書にするしかなかったけど、
今度、言語仕様に組み込まれそうだし。
956デフォルトの名無しさん:2007/07/17(火) 19:32:47
traitとconceptの違いが分からない
modern C++ design読めってことですかそうですか
957デフォルトの名無しさん:2007/07/17(火) 20:43:42
イテレータは、ポインタまたは、 std::iterator を継承していることが必須条件
だから、どちらの場合でも、iterator_category でイテレータの特性を知ることが出来るよ。
958デフォルトの名無しさん:2007/07/18(水) 01:10:19
>>956
trait は型について問い合わせるために使える個々の情報。
concept は型が満たすべき条件と意味づけをひとまとめにしたもの。
959デフォルトの名無しさん:2007/07/18(水) 19:28:11
>>957
イテレータは別にstd::iteratorを継承する必要はなく、十分条件に過ぎない。
それを継承すれば、その型に対して簡単にiterator_traitsが使用可能になるというだけ。
960デフォルトの名無しさん:2007/07/18(水) 19:38:24
でも、iterator_traits が使えないと、advance と distance を個別に実装しないと動かない罠
961デフォルトの名無しさん:2007/07/18(水) 20:24:02
std::iteratorを継承せずとも、自分でイテレータのクラスに
value_typeやiterator_categoryなどを定義すれば、
iterator_traitsは使える。

iterator_traitsを特殊化するというもっと荒業めいた方法もある。
962デフォルトの名無しさん:2007/07/19(木) 12:38:51
テンプレート特殊化って
既存のクラスに後からトレイトやらコンセプトやら
情報を書けるから便利だよな。
これぞ再利用。
963デフォルトの名無しさん:2007/07/20(金) 14:11:58
>>945
sstreamがどうしたって?
964デフォルトの名無しさん:2007/07/20(金) 15:03:09
strsteamの間違いだろ。
965デフォルトの名無しさん:2007/07/20(金) 18:46:03
ボケなのか素なのか分からないよ
966デフォルトの名無しさん:2007/07/20(金) 21:28:59
VC8のiostreamなんですけどね
読み書きするたびにmutex確保するんですよ
無駄なんですよ
なんとかなりませんかね
967デフォルトの名無しさん:2007/07/20(金) 21:42:43
ならん。
もうシングルスレッドの時代は終わった。
968デフォルトの名無しさん:2007/07/20(金) 21:50:59
>>966
streambufを直接いじくれば?
969デフォルトの名無しさん:2007/07/20(金) 22:15:28
直接いじくるんならstdを使う価値があまりなかったり・・・
できればpolicyやらで制御できてほしかったンですけどネ・・・
970デフォルトの名無しさん:2007/07/20(金) 23:24:54
>>966
CRT用に_CRT_DISABLE_PERFCRIT_LOCKSがある。
これはC++ライブラリでも効くのかは知らないけど。
http://msdn2.microsoft.com/ja-jp/library/ms235356(VS.80).aspx
971デフォルトの名無しさん:2007/07/21(土) 00:52:02
STLport(5.1.1)の設定システムがよくわからないんだけど、
host.hがSTLのビルド時に使う途中変更不可の設定で、
user_config.hがSTLを使うプロジェクトによって変更してもいい設定、
という理解で良い?
972デフォルトの名無しさん:2007/07/21(土) 05:44:30
>>970
レスありがとうございます。
チェックいたしましたが、iostreamでは参照されていないようです・・・
973デフォルトの名無しさん:2007/07/22(日) 00:50:50
STLPortはシングルスレッド版のiostream用意してなかったっけ
最近のバージョンはそのあたりのビルドがめんどくさくなったが
974デフォルトの名無しさん:2007/07/23(月) 20:29:06
C++でデータマネジメント用のライブラリなんてありますか?
マージしたりマージしたり・・・・
975デフォルトの名無しさん:2007/07/23(月) 21:05:02
何をどうマージするの?
976デフォルトの名無しさん:2007/07/23(月) 21:13:30
C++でETLはありだな。
977デフォルトの名無しさん:2007/07/28(土) 15:10:26
もうミンナについて行けない。
もだんなんとかって本読むよ
978デフォルトの名無しさん:2007/07/28(土) 18:14:56
もだんなんとかは勉強になるけどちょっとふるいな
979名無しさん@そうだ選挙に行こう:2007/07/29(日) 03:44:16
>>978
theoretically interesting for some people, but practically useless!
980名無しさん@そうだ選挙に行こう:2007/07/29(日) 08:17:13
boost::mpl本の和訳ってまだ出てないんだよなぁ…
981名無しさん@そうだ選挙に行こう:2007/07/29(日) 12:14:04
class CTest{
public:
int nNo; //学籍番号
char szName[20]; //生徒名
int nTensu; //テスト点数
}
上記のようなクラスのインスタンスをvectorに格納しておいて
場合によって、ソート条件を変更したいのですが、どのように
すればいいでしょうか?
学籍番号ソート、生徒名ソート、点数ソートなどしたいのですが。

ソートの為の比較演算子だと1パターンしかソート条件を定義できないような
気がして・・。
operator<(const CTest &a)const{
return nTensu < a.nTensu;
}
どなたかご教示の程、お願いしますm(__)m。
982名無しさん@そうだ選挙に行こう:2007/07/29(日) 12:21:52
>>981
std::sortに好きな比較関数オブジェクト作って渡せば?
983名無しさん@そうだ選挙に行こう:2007/07/29(日) 12:26:19
>>981
素直にやるなら>>982
邪道な方法としてはメンバ変数にソート用のフラグを用意して、
それをもとにoperator<() の中で分岐
フラグはソート前にセットする。
984名無しさん@そうだ選挙に行こう:2007/07/29(日) 12:30:35
>>983
邪道というか、単なる下手な方法では。
985名無しさん@そうだ選挙に行こう:2007/07/29(日) 12:42:00
というか典型的な関数オブジェクトを活用するパターンだよな
986名無しさん@そうだ選挙に行こう
関数オブジェクトをキーワードにサンプルを探せました。
どうもありがとうございましたm(__)m