トップページ⇒tech
1001コメント253KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
関連スレなどは>>2以降で
0263デフォルトの名無しさんNGNG
>>262
もともとはLispのlambda式なんだけどね。
BOOSTのlambdaはちょっと違和感があるけれど。。。
0264デフォルトの名無しさんNGNG
>>259
すれ違いで悪いんですが、Delphiでの解決方法教えてください
0265デフォルトの名無しさんNGNG
>>264
257はありだろうけど
さすがにそれはDelphiスレで聞くべきだよ
(本当に知りたければね)
0266デフォルトの名無しさんNGNG
>>259
アホは放置しろ。
0267デフォルトの名無しさんNGNG
そういえば結局、次期標準でBoostから採用されるものって何なんだ?
0268デフォルトの名無しさんNGNG
>>267
ttp://jbbs.livedoor.jp/bbs/read.cgi/computer/5651/1048584601/88
0269デフォルトの名無しさんNGNG
日本語読めないの
0270268NGNG
>>269
スマン寝てないの
0271デフォルトの名無しさんNGNG
>>267
function, tuple, type_traits, regex, mem_fn, shared_ptr, ref, bind
0272デフォルトの名無しさんNGNG
とりあえずofficial wishlist置いときますね
http://lafstern.org/matt/wishlist.html
0273デフォルトの名無しさんNGNG
STLportにバグが見つかったそうな。
0274デフォルトの名無しさんNGNG
>>273
('A`) マジデ?
0275デフォルトの名無しさんNGNG
いっぱいあるだろそんなもん。
0276デフォルトの名無しさんNGNG
STLPortなんてどうして使うの?
0277デフォルトの名無しさんNGNG
>>276
付属stlがくそだからじゃないか?
0278デフォルトの名無しさんNGNG
STLSoftもつかおーぜ
0279デフォルトの名無しさんNGNG
>>278
そんな怪しい名前のソフトは使いたくねーなw
0280デフォルトの名無しさんNGNG
>274
多分これ。
ttp://www.freeml.com/message/[email protected]/0011266
0281デフォルトの名無しさんNGNG
std::map<std::string,int> Map;

Map.insert(std::pair<std::string,int>(std::string(""),1));
            ~~~~~~~~~~~~~~~
の部分をハードコーディングではなく書けませんか?
0282デフォルトの名無しさんNGNG
typedef std::map<std::string,int> OrenoMap;
typedef std::pair<std::string,int> OrenoPair;

OrenoMap Map;

Map.insert(OrenoPair(std::string(""),1));
0283デフォルトの名無しさんNGNG
>>281
typedef std::pair<std::string,int> hoge;
0284デフォルトの名無しさんNGNG
う゛ぁぅえ_tyぺ
0285デフォルトの名無しさんNGNG
>>281
std::pair<>(std::string(""), 1)
ってこと?
0286デフォルトの名無しさんNGNG
>>285
それOKなんですか?
0287デフォルトの名無しさんNGNG
Map[""] = 1;
0288デフォルトの名無しさんNGNG
>>286
ダメだからmake_pairってのが用意されてたりする
0289デフォルトの名無しさんNGNG
>>281
Map.insert(std::make_pair(std::string(""), 1));

古いコンパイラだと受け付けないのもあるかもしれませんが・・・.
0290デフォルトの名無しさんNGNG
typedef std::map<std::string,int> MapT;

MapT m;
m.insert(MapT::value_type(std::string(""),1));
0291デフォルトの名無しさんNGNG
m.insert(MapT::value_type("",1));
でもOK
0292デフォルトの名無しさんNGNG
そんな面倒なことせんでも>>287でOKだろ。
0293デフォルトの名無しさんNGNG
こうr
0294デフォルトの名無しさんNGNG
>>292
意味が違うし
0295デフォルトの名無しさんNGNG
>>294
詳しく
0296デフォルトの名無しさんNGNG
map::insertはkeyが既存の場合,値が変更されません.
287さんのはkeyが既存のものも変更されます.
あと,細かいところだと293さんが書かれているの(効率)もあります.
0297rubykitchNGNG
全部EffectiveSTLの受け売りですねぷぷううううううううううううううううううううううううううううう
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>C++
0298デフォルトの名無しさんNGNG
SuperRubyistはEffectiveSTLまで読んだのか
0299デフォルトの名無しさんNGNG
SuperRubyisは勉強熱心だね。
0300デフォルトの名無しさんNGNG
vector <string> temp;

ってやっちゃっていいのでしょうか?
なんかVC6だと警告でるのですが・・・。
0301デフォルトの名無しさんNGNG
>>300
警告の内容も晒さずに人様の貴重な時間を浪費して良くそんなことが聞けるな。
0302Ruby!!!!!!!!!!!!!!!NGNG
vc6は窓から投げ捨てろ
0303デフォルトの名無しさんNGNG
>>300
それは無害です。

E:\Project\Test755\Test755.cpp(16) : warning C4786: 'std::reverse_iterator<......'
: 識別子が '255' 文字に切り捨てられました (debug 情報内)。
0304デフォルトの名無しさんNGNG
>>301
もうしわけありませんでした。
って、調べてみたら解決しました。

どうやらVCのコンパイラが対応していないだけってことだったらしいです。

#pragma warning(disable:4786)

っというように追加して、みんなやってるようです。
0305デフォルトの名無しさんNGNG
>>303
レスありがとうございました。
0306デフォルトの名無しさんNGNG
今更だけど、std::mapより素直に力技のstd::vectorの検索を実装しといた方が柔軟な仕様変更に強いね。
メモリ消費量も断片化しないからstd::vetorは捨てたものじゃない。
当初の予想以上に作り込む必要が出てきたときstd::mapは厳しいね、いろんな意味で。
0307デフォルトの名無しさんNGNG
おいおい…
お前の設計段階での抽象化が甘いだけだよ。
0308デフォルトの名無しさんNGNG
>>306
力技の実装が素直なわけないだろ。
「仕様変更に強い」ではなくて、
たまたま実装に都合のいい仕様変更がはいっただけじゃないのか?

特殊なケースを一般的であるかのように言うのは感心できない。
0309デフォルトの名無しさんNGNG
そもそもvectorを代わりに使うならmapじゃなくてmultisetになりそうなもんだが
0310デフォルトの名無しさんNGNG
>>309 どっちでもいけるだろ。
0311デフォルトの名無しさんNGNG
map<T1, T2>をvector<pair<T1, T2> >にしたのかもしれん
0312デフォルトの名無しさんNGNG
>>311
その通りですが、なにか?
0313306NGNG
コンテナ要素が複雑であった場合は結局、諸々の検索方法を実装しなければならず、
std::mapのキー検索の存在感が、かすむ、かすむ。
みんなはどうしてるわけ?mapにおけるキー以外の検索。
0314デフォルトの名無しさんNGNG
>>313
boost::multi_index

ってのはもうちょっと先の話だが、
キー以外の検索があるのなら map に不満が出るのはあたりまえ。
最初っからそう言えよ。
0315デフォルトの名無しさんNGNG
普通に考えて、set<自分で作ったクラス>、だろ。
他に選択肢がありえる理由がわからん。
0316デフォルトの名無しさんNGNG
>>315
less でソートされてる必要は無いから set で保持するのは無駄だろ。
0317デフォルトの名無しさんNGNG
std::vectorで済むものはそうしているし、
駄目なものは他のものを使っている。例えば赤黒木。
いずれにせよ、検索のための"algorithm"をstd::vector専用に書いたりはしない。
0318デフォルトの名無しさんNGNG
>>316
いつも無駄なわけじゃないだろ?
0319306NGNG
>>315
std::setはメモリ消費量が大きいです。無駄多し。vector<list<setです。VC6,VC7で確認済み。
メモリを一括確保できるstd::vector::reserve()がある限り、std::vector最強だと思います。
ちなみに要素をswapしたい場合などは配列を直接移動させることは避けて
これまたポインタ配列やポインタリストを用意して順序付けするようにしてますが。
std::setは論外です。std::setは柔軟性の点で劣るかと。重み付けがかえって邪魔になる事多し。
0320デフォルトの名無しさんNGNG
ねぇ、おまいらSTLとかなんかよりまずは
C++を勉強してこい、話はそれからだな
0321デフォルトの名無しさんNGNG
>>319
ひょっとして、検索が主な用途じゃないのか?
0322デフォルトの名無しさんNGNG
>>319
なんで初めにmapを使ったのか、理由を教えて。
0323デフォルトの名無しさんNGNG
>>319
メモリ消費量の大きさが「無駄」になるかどうかは使う場面ごとに違うだろ。
reserve するためには要素数に対する前提が必要だろ。

繰り返すが、
特殊なケースを一般的であるかのように言うのは感心できない。
0324306NGNG
>>322
実は、自分のPCに数十万のファイルがあってファイルを探すのが面倒なので
ファイル名だけでフルパス名を取得できる仕組みを作ってたのですが、
ファイル名をキーにして、ファイルのフルパス名・その他情報を値としてstd::mapを構成していたのですが、
色気を出してワイルドカード検索できるようにしようとした時点でstd::mapによる設計が形骸化しました。
現在そのプログラムはバックグラウンドで動かすサーバ形式をとっているのですが、
ファイルが数十万なので常駐メモリが100MBを超えています。(※意図的なものです。)
ギガクラスのメモリを乗せる時代に見合ったファイルインデックスシステムがあってもいいかな、と。
ゲームやVMでしかメモリをフル稼働しないのは勿体ない気がしたこともありまして。
0325デフォルトの名無しさんNGNG
setでinsertしまくると遅い事に気づいたんだけどうまい方法無い?
挿入するまとまりを、
vectorに一旦入れてからset.insert(vec.begin(), vec.end())みたいな感じで
まるごとinsertしてみたけど意味無かった。
0326デフォルトの名無しさんNGNG
[cppll:5647] ソート済みベクタは遅い?
これ見てからはもっぱらソース済みvectorは使わなくなったな。
0327デフォルトの名無しさんNGNG
>>324
おもいっきり>>307-308じゃんかw
0328デフォルトの名無しさんNGNG
>>323
自分の経験則からいくと、vector::reserveの冗長性を織り込んだメモリ消費量より、
std::listやstd::set,std::mapのメモリ断片化によるメモリ消費量の肥大化の方が厄介でした。
多くの場合、要素数のおおよその数が分かっているので、したがってvectorが最適である可能性が高い。
しかも、そのサイズに関する最適化の効果を確実に得られるのもvectorの特徴。
他のコンテナではPGによる最適化の手段が限られている。
0329デフォルトの名無しさんNGNG
>要素数のおおよその数
予想も付かない場合が多い。
0330デフォルトの名無しさんNGNG
vectorはPGが要素数を教えて上げないと極端に遅くなるか
極端にメモリが無駄になるかのどちらかになるから。

vector以外のコンテナはそんな事は無い。
0331デフォルトの名無しさんNGNG
つかそこまでいったらUNIX DBとかsqliteぐらい使えよ。
0332デフォルトの名無しさんNGNG
>>328
要素数が多くて、さらに、その数が予め解かってる場合は、
vectorがいいですね、そうですね、そうですよ。
0333デフォルトの名無しさんNGNG
>>329
さっきからstd::setを賞賛する痛い人と同一人物ですか?
同一人物でしたら残念ですが同意できません。
別人でしたら同意します。やっぱこういうのは、ケースバイケースですから。
0334デフォルトの名無しさんNGNG
>>326
ソース済みvector(・∀・)イイ!
0335デフォルトの名無しさんNGNG
>>333
ハゲワラタ
0336デフォルトの名無しさんNGNG
>>333
setを薦めてるレスは>>315だけじゃない?
それも要素数の話が出る前の検索用コンテナの話題で。
0337デフォルトの名無しさんNGNG
俺も306なら不同意だけど、他なら同意だ。
ケースバイケースだからな。
0338306NGNG
ぶっちゃけ、>>324で述べた仕様が、
Unixにおけるlocate・slocateコマンドをメモリ常駐バージョン化して毛が生えた
他愛のないものであることは十分承知してます。でも作ってしまったものはしょうがない。orz
0339デフォルトの名無しさんNGNG
検索するインデックスキーがある程度決まってる場合は
setがいいよ。

[cppll:5687]から転載
3000ms - set<int> set::lower_bound
3203ms - set<int> set::find
4188ms - vector<int> lower_bound
4547ms - vector<int> binary_search
4719ms - vector<int> equal_range
5109ms - set<int> set::count

VC7+付属STL 要素数1000 ヒット率50% ループ回数 1千万
10125ms - set<string> set::find
11265ms - set<string> set::lower_bound
13250ms - vector<string> binary_search
15078ms - vector<string> lower_bound
17297ms - set<string> set::count
17328ms - vector<string> equal_range

検索するインデックスキーが全然決まってない場合は
要素数が分かってる場合…vector
分からない場合…deque
がいいよ。
0340デフォルトの名無しさんNGNG
やっぱ言葉足らずな人が出ると盛り上がるな。
0341デフォルトの名無しさんNGNG
>>328
vector は reserve が使える。それだけ憶えとけば十分。
そんな経験則、実際の判断に勘定するべきではない。

> メモリ断片化によるメモリ消費量の肥大化
ほんとで「断片化」が原因だったのか、怪しい言い回しだな。
0342デフォルトの名無しさんNGNG
邪道だが、std::vectorをqsort()でソートすると効率が大幅に改善するから使ってる。
qsort(&v[0], v.size(), sizeof(v::reference_type), comp_func);


というか、なぜvector::sort()はあんなに遅いのだろうか・・・。
vector::stable_sort()は現在順序を反映してくれるので許せるが。
0343デフォルトの名無しさんNGNG
STLにvector::sort()なんて存在しません
0344342NGNG
>>343
失礼。訂正。

vector::sort() → std::sort()
vector::stable_sort() → std::stable_sort()
0345デフォルトの名無しさんNGNG
Celeron 1GHz, mem 256MB, VC++7.1で実験
int 1000000個を持ったvectorのソート

最適化なし qsort 1.9s sort 6.2s
最適化あり qsort 1.1s sort 0.8s

最適化してなかったとかいうオチだったらヌッコロス
0346デフォルトの名無しさんNGNG
>>345
ちゃんと文字列を入れたstringで試してみ
0347デフォルトの名無しさんNGNG
>>345
intでやってみた。
ソースは
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=250
環境AthlonXP3000+、PC2700 1GB、XPSP1

vector algorithm sort = 5198079
vector qsort = 8201075
vector stable sort = 9188932

vectorの中身によって大幅に変わる。
0348デフォルトの名無しさんNGNG
おまいら部分ソートってのしらないの?
0349デフォルトの名無しさんNGNG
なんで部分ソートが出てくるの?
0350デフォルトの名無しさんNGNG
partial_sort()を使ってどうする。この場合。
0351デフォルトの名無しさんNGNG
某スレで出たstringでの比較用コード

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <windows.h>
#include <string>
int compare(const void* a, const void* b) { return strcmp(((std::string*)a)->c_str(), ((std::string*)b)->c_str()); }
struct Compare :
public std::binary_function<const std::string&, const std::string&, bool>
{
inline bool operator ()(const std::string& a, const std::string& b) const
{ return strcmp(a.c_str(), b.c_str()) < 0; }
};
const int ssize = 1000000;
main()
{
std::string *s = new std::string[ssize];
for(int i=0;i<ssize;i++)
{
for(int i=0;i<16;i++)
{
s[i] += char(rand() % 26 + 'a');
}
}
DWORD t = GetTickCount();
//qsort(s, ssize, sizeof(std::string), compare);
//std::sort(s, s+ssize, Compare())
std::sort(s, s+ssize);
printf("%dms\n", GetTickCount()-t);
delete[] s;
}
0352デフォルトの名無しさんNGNG
>>351
VC++7.1 -O2 -GX
qsort
201ms
std::sort(Compare())
511ms
std::sort
481ms
0353デフォルトの名無しさんNGNG
>>351
for(int i=0;i<16;i++)
はjにしなきゃ。
0354デフォルトの名無しさんNGNG
>>351
std::sort()の方はコンストラクタ・デストラクタ・コピーコンストラクタ・代入演算子
が頻繁に使われてしまうから、これではまともな比較ができん。
0355デフォルトの名無しさんNGNG
jに直した物
VC++7.1 -O2 -GX
qsort
4256ms
std::sort(Compare())
5116ms
std::sort
6960ms
0356デフォルトの名無しさんNGNG
>>354
どう直したらまともな比較になるの?
0357デフォルトの名無しさんNGNG
std::sortって
コンストラクタ・デストラクタ・コピーコンストラクタ・代入演算子を
定義し直さないといけないのか。
使うの面倒だな
0358デフォルトの名無しさんNGNG
std::stringにはswap()メンバ関数があるから、それを活用して特殊化した
sort()が必要そうだな。どちらにしろqsort()は動かない処理系はまずない
だろうが、危険な香りがプンプンする。
0359デフォルトの名無しさんNGNG
いや,stringに対して自由関数のswapが特殊化されているのは
標準で明記されていますよ.だから,sortはこのswapを使うはず.
なので,上のようなoverheadの由来がよく分かりません.
どこに原因があるのか知りたいです.(sortの実装詳細?)
0360デフォルトの名無しさんNGNG
>>359
標準のstd::sort()はstd::stringに対してswapを使うと明記されてるの?
初耳だが。STLport4.6.2を調べてみたが、特殊化されている気配はない。
std::stringの場合はsort()を自作した方がいいんじゃないの?そんなに
速度の低下が気になるなら。
0361デフォルトの名無しさんNGNG
組込型をソートするならstd::sort
クラス・構造体をソートする時はqsort
と使い分けるのが良さそうだな。
0362デフォルトの名無しさんNGNG
Effective STLは嘘つきだな
■ このスレッドは過去ログ倉庫に格納されています