【C++】STL(Standard Template Library)相談室
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG0263デフォルトの名無しさん
NGNGもともとはLispのlambda式なんだけどね。
BOOSTのlambdaはちょっと違和感があるけれど。。。
0264デフォルトの名無しさん
NGNGすれ違いで悪いんですが、Delphiでの解決方法教えてください
0265デフォルトの名無しさん
NGNG257はありだろうけど
さすがにそれはDelphiスレで聞くべきだよ
(本当に知りたければね)
0266デフォルトの名無しさん
NGNGアホは放置しろ。
0267デフォルトの名無しさん
NGNG0268デフォルトの名無しさん
NGNGttp://jbbs.livedoor.jp/bbs/read.cgi/computer/5651/1048584601/88
0269デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNGfunction, tuple, type_traits, regex, mem_fn, shared_ptr, ref, bind
0272デフォルトの名無しさん
NGNGhttp://lafstern.org/matt/wishlist.html
0273デフォルトの名無しさん
NGNG0274デフォルトの名無しさん
NGNG('A`) マジデ?
0275デフォルトの名無しさん
NGNG0276デフォルトの名無しさん
NGNG0277デフォルトの名無しさん
NGNG付属stlがくそだからじゃないか?
0278デフォルトの名無しさん
NGNG0279デフォルトの名無しさん
NGNGそんな怪しい名前のソフトは使いたくねーなw
0280デフォルトの名無しさん
NGNG多分これ。
ttp://www.freeml.com/message/[email protected]/0011266
0281デフォルトの名無しさん
NGNGMap.insert(std::pair<std::string,int>(std::string(""),1));
~~~~~~~~~~~~~~~
の部分をハードコーディングではなく書けませんか?
0282デフォルトの名無しさん
NGNGtypedef std::pair<std::string,int> OrenoPair;
OrenoMap Map;
Map.insert(OrenoPair(std::string(""),1));
0283デフォルトの名無しさん
NGNGtypedef std::pair<std::string,int> hoge;
0284デフォルトの名無しさん
NGNG0285デフォルトの名無しさん
NGNGstd::pair<>(std::string(""), 1)
ってこと?
0286デフォルトの名無しさん
NGNGそれOKなんですか?
0287デフォルトの名無しさん
NGNG0288デフォルトの名無しさん
NGNGダメだからmake_pairってのが用意されてたりする
0289デフォルトの名無しさん
NGNGMap.insert(std::make_pair(std::string(""), 1));
古いコンパイラだと受け付けないのもあるかもしれませんが・・・.
0290デフォルトの名無しさん
NGNGMapT m;
m.insert(MapT::value_type(std::string(""),1));
0291デフォルトの名無しさん
NGNGでもOK
0292デフォルトの名無しさん
NGNG0293デフォルトの名無しさん
NGNG0294デフォルトの名無しさん
NGNG意味が違うし
0295デフォルトの名無しさん
NGNG詳しく
0296デフォルトの名無しさん
NGNG287さんのはkeyが既存のものも変更されます.
あと,細かいところだと293さんが書かれているの(効率)もあります.
0297rubykitch
NGNGRuby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>C++
0298デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNG0300デフォルトの名無しさん
NGNGってやっちゃっていいのでしょうか?
なんかVC6だと警告でるのですが・・・。
0301デフォルトの名無しさん
NGNG警告の内容も晒さずに人様の貴重な時間を浪費して良くそんなことが聞けるな。
0302Ruby!!!!!!!!!!!!!!!
NGNG0303デフォルトの名無しさん
NGNGそれは無害です。
E:\Project\Test755\Test755.cpp(16) : warning C4786: 'std::reverse_iterator<......'
: 識別子が '255' 文字に切り捨てられました (debug 情報内)。
0304デフォルトの名無しさん
NGNGもうしわけありませんでした。
って、調べてみたら解決しました。
どうやらVCのコンパイラが対応していないだけってことだったらしいです。
#pragma warning(disable:4786)
っというように追加して、みんなやってるようです。
0305デフォルトの名無しさん
NGNGレスありがとうございました。
0306デフォルトの名無しさん
NGNGメモリ消費量も断片化しないからstd::vetorは捨てたものじゃない。
当初の予想以上に作り込む必要が出てきたときstd::mapは厳しいね、いろんな意味で。
0307デフォルトの名無しさん
NGNGお前の設計段階での抽象化が甘いだけだよ。
0308デフォルトの名無しさん
NGNG力技の実装が素直なわけないだろ。
「仕様変更に強い」ではなくて、
たまたま実装に都合のいい仕様変更がはいっただけじゃないのか?
特殊なケースを一般的であるかのように言うのは感心できない。
0309デフォルトの名無しさん
NGNG0310デフォルトの名無しさん
NGNG0311デフォルトの名無しさん
NGNG0312デフォルトの名無しさん
NGNGその通りですが、なにか?
0313306
NGNGstd::mapのキー検索の存在感が、かすむ、かすむ。
みんなはどうしてるわけ?mapにおけるキー以外の検索。
0314デフォルトの名無しさん
NGNGboost::multi_index
ってのはもうちょっと先の話だが、
キー以外の検索があるのなら map に不満が出るのはあたりまえ。
最初っからそう言えよ。
0315デフォルトの名無しさん
NGNG他に選択肢がありえる理由がわからん。
0316デフォルトの名無しさん
NGNGless でソートされてる必要は無いから set で保持するのは無駄だろ。
0317デフォルトの名無しさん
NGNG駄目なものは他のものを使っている。例えば赤黒木。
いずれにせよ、検索のための"algorithm"をstd::vector専用に書いたりはしない。
0318デフォルトの名無しさん
NGNGいつも無駄なわけじゃないだろ?
0319306
NGNGstd::setはメモリ消費量が大きいです。無駄多し。vector<list<setです。VC6,VC7で確認済み。
メモリを一括確保できるstd::vector::reserve()がある限り、std::vector最強だと思います。
ちなみに要素をswapしたい場合などは配列を直接移動させることは避けて
これまたポインタ配列やポインタリストを用意して順序付けするようにしてますが。
std::setは論外です。std::setは柔軟性の点で劣るかと。重み付けがかえって邪魔になる事多し。
0320デフォルトの名無しさん
NGNGC++を勉強してこい、話はそれからだな
0321デフォルトの名無しさん
NGNGひょっとして、検索が主な用途じゃないのか?
0322デフォルトの名無しさん
NGNGなんで初めにmapを使ったのか、理由を教えて。
0323デフォルトの名無しさん
NGNGメモリ消費量の大きさが「無駄」になるかどうかは使う場面ごとに違うだろ。
reserve するためには要素数に対する前提が必要だろ。
繰り返すが、
特殊なケースを一般的であるかのように言うのは感心できない。
0324306
NGNG実は、自分のPCに数十万のファイルがあってファイルを探すのが面倒なので
ファイル名だけでフルパス名を取得できる仕組みを作ってたのですが、
ファイル名をキーにして、ファイルのフルパス名・その他情報を値としてstd::mapを構成していたのですが、
色気を出してワイルドカード検索できるようにしようとした時点でstd::mapによる設計が形骸化しました。
現在そのプログラムはバックグラウンドで動かすサーバ形式をとっているのですが、
ファイルが数十万なので常駐メモリが100MBを超えています。(※意図的なものです。)
ギガクラスのメモリを乗せる時代に見合ったファイルインデックスシステムがあってもいいかな、と。
ゲームやVMでしかメモリをフル稼働しないのは勿体ない気がしたこともありまして。
0325デフォルトの名無しさん
NGNG挿入するまとまりを、
vectorに一旦入れてからset.insert(vec.begin(), vec.end())みたいな感じで
まるごとinsertしてみたけど意味無かった。
0326デフォルトの名無しさん
NGNGこれ見てからはもっぱらソース済みvectorは使わなくなったな。
0327デフォルトの名無しさん
NGNGおもいっきり>>307-308じゃんかw
0328デフォルトの名無しさん
NGNG自分の経験則からいくと、vector::reserveの冗長性を織り込んだメモリ消費量より、
std::listやstd::set,std::mapのメモリ断片化によるメモリ消費量の肥大化の方が厄介でした。
多くの場合、要素数のおおよその数が分かっているので、したがってvectorが最適である可能性が高い。
しかも、そのサイズに関する最適化の効果を確実に得られるのもvectorの特徴。
他のコンテナではPGによる最適化の手段が限られている。
0329デフォルトの名無しさん
NGNG予想も付かない場合が多い。
0330デフォルトの名無しさん
NGNG極端にメモリが無駄になるかのどちらかになるから。
vector以外のコンテナはそんな事は無い。
0331デフォルトの名無しさん
NGNG0332デフォルトの名無しさん
NGNG要素数が多くて、さらに、その数が予め解かってる場合は、
vectorがいいですね、そうですね、そうですよ。
0333デフォルトの名無しさん
NGNGさっきからstd::setを賞賛する痛い人と同一人物ですか?
同一人物でしたら残念ですが同意できません。
別人でしたら同意します。やっぱこういうのは、ケースバイケースですから。
0334デフォルトの名無しさん
NGNGソース済みvector(・∀・)イイ!
0335デフォルトの名無しさん
NGNGハゲワラタ
0336デフォルトの名無しさん
NGNGsetを薦めてるレスは>>315だけじゃない?
それも要素数の話が出る前の検索用コンテナの話題で。
0337デフォルトの名無しさん
NGNGケースバイケースだからな。
0338306
NGNGUnixにおけるlocate・slocateコマンドをメモリ常駐バージョン化して毛が生えた
他愛のないものであることは十分承知してます。でも作ってしまったものはしょうがない。orz
0339デフォルトの名無しさん
NGNGsetがいいよ。
[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デフォルトの名無しさん
NGNG0341デフォルトの名無しさん
NGNGvector は reserve が使える。それだけ憶えとけば十分。
そんな経験則、実際の判断に勘定するべきではない。
> メモリ断片化によるメモリ消費量の肥大化
ほんとで「断片化」が原因だったのか、怪しい言い回しだな。
0342デフォルトの名無しさん
NGNGqsort(&v[0], v.size(), sizeof(v::reference_type), comp_func);
というか、なぜvector::sort()はあんなに遅いのだろうか・・・。
vector::stable_sort()は現在順序を反映してくれるので許せるが。
0343デフォルトの名無しさん
NGNG0345デフォルトの名無しさん
NGNGint 1000000個を持ったvectorのソート
最適化なし qsort 1.9s sort 6.2s
最適化あり qsort 1.1s sort 0.8s
最適化してなかったとかいうオチだったらヌッコロス
0346デフォルトの名無しさん
NGNGちゃんと文字列を入れたstringで試してみ
0347デフォルトの名無しさん
NGNGintでやってみた。
ソースは
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デフォルトの名無しさん
NGNG0349デフォルトの名無しさん
NGNG0350デフォルトの名無しさん
NGNG0351デフォルトの名無しさん
NGNG#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デフォルトの名無しさん
NGNGVC++7.1 -O2 -GX
qsort
201ms
std::sort(Compare())
511ms
std::sort
481ms
0353デフォルトの名無しさん
NGNGfor(int i=0;i<16;i++)
はjにしなきゃ。
0354デフォルトの名無しさん
NGNGstd::sort()の方はコンストラクタ・デストラクタ・コピーコンストラクタ・代入演算子
が頻繁に使われてしまうから、これではまともな比較ができん。
0355デフォルトの名無しさん
NGNGVC++7.1 -O2 -GX
qsort
4256ms
std::sort(Compare())
5116ms
std::sort
6960ms
0356デフォルトの名無しさん
NGNGどう直したらまともな比較になるの?
0357デフォルトの名無しさん
NGNGコンストラクタ・デストラクタ・コピーコンストラクタ・代入演算子を
定義し直さないといけないのか。
使うの面倒だな
0358デフォルトの名無しさん
NGNGsort()が必要そうだな。どちらにしろqsort()は動かない処理系はまずない
だろうが、危険な香りがプンプンする。
0359デフォルトの名無しさん
NGNG標準で明記されていますよ.だから,sortはこのswapを使うはず.
なので,上のようなoverheadの由来がよく分かりません.
どこに原因があるのか知りたいです.(sortの実装詳細?)
0360デフォルトの名無しさん
NGNG標準のstd::sort()はstd::stringに対してswapを使うと明記されてるの?
初耳だが。STLport4.6.2を調べてみたが、特殊化されている気配はない。
std::stringの場合はsort()を自作した方がいいんじゃないの?そんなに
速度の低下が気になるなら。
0361デフォルトの名無しさん
NGNGクラス・構造体をソートする時はqsort
と使い分けるのが良さそうだな。
0362デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています