【C++】STL(Standard ..
655:デフォルトの名無しさん
08/11/25 18:14:47
>>652
要素の連続性がいらないがアクセスがランダム性高い状態ならdequeにしとけ
656:デフォルトの名無しさん
08/11/25 18:39:03
周りがアドバイスしても結局自分の方法に固執するんじゃ
何言っても意味ないよ
そういうのはほっとくに限る
657:デフォルトの名無しさん
08/11/25 18:44:27
挿入/削除が多いならリストを使うべきだろ
ときどきランダムアクセスが必要ならstd::advanceで
658:デフォルトの名無しさん
08/11/25 18:51:51
advanceを思いっきり勘違いしてる節があるよね
659:デフォルトの名無しさん
08/11/25 18:58:49
>>655
配列要素数が数万個以下の場合は、dequeよりむしろvectorの方が速かった。
VS2005でコンパイルした場合だけど。
660:デフォルトの名無しさん
08/11/25 19:05:31
>>659
何が?
661:デフォルトの名無しさん
08/11/25 19:28:06
用途によっては挿入/削除/ランダムアクセスが全部O(log n)のデータ構造も検討するといいかもな
STLにはないけど
662:デフォルトの名無しさん
08/11/25 19:31:05
>>647より後の返答カキコ 本当に>>647なのか?
おまえら、誰かに釣られてないか?
IDのない板って、なりすまし可能だからな
663:デフォルトの名無しさん
08/11/25 19:35:42
質問に答えてるだけなんだから、>>647と>>650が同一人物であろうとなかろうと何も関係ない
釣りだったとしても痛くも痒くもない
664:デフォルトの名無しさん
08/11/25 20:03:28
std::vector<要素 *>
665:デフォルトの名無しさん
08/11/25 20:30:10
skip listか
んなもんわざわざ使うなら普通にlistでもいいと思うけどな
666:デフォルトの名無しさん
08/11/25 20:40:43
setについて質問です
URLリンク(www5c.biglobe.ne.jp)
要素の追加(追加場所をイタレーターで指定) 定数時間
とありますが、追加場所をイタレーターで指定とはどういうことですか?
insert関数ではないですよね?
667:デフォルトの名無しさん
08/11/25 21:02:51
>>647はlistを使うのを前提として質問していて
listの代わりに何が良いかは質問してないようによめるのだが
668:デフォルトの名無しさん
08/11/25 21:04:52
>>666
insertのことだと思うが
669:デフォルトの名無しさん
08/11/25 21:11:14
>>666
setにはイテレータを指定するinsertと指定しないinsertがあるよ
670:デフォルトの名無しさん
08/11/25 21:15:27
vectorにそのままクラスを入れるとコピーコンストラクタを何度も呼び出してるようなので
クラスのポインタを入れて使おうかと思ってるのですが
何か注意しなければ行けない点はありますか?
671:デフォルトの名無しさん
08/11/25 21:17:35
>>670
ないです。
672:デフォルトの名無しさん
08/11/25 21:18:02
あります
vectorから取り除いたときのdeleteし忘れ
673:デフォルトの名無しさん
08/11/25 21:20:48
>>670
オブジェクトの多重参照
674:デフォルトの名無しさん
08/11/25 21:54:32
FUGAはduobleとstringのpairです
multiset<FUGA> huga;
にいくつかデータが入っています。これからある文字列(stiring)の数をカウントしたいんですがどうすればいいでしょうか?
count関数がありますけど使い方が・・・
huga.count("hogehoge");みたいな感じで使いたいんです
675:デフォルトの名無しさん
08/11/25 22:04:16
>>674
count_if()
676:デフォルトの名無しさん
08/11/25 23:21:30
>>671-673
サンクス deleteしなきゃだったんだな
ありがとう
677:デフォルトの名無しさん
08/11/26 00:50:01
>>670
ptr_vectorでも使えば
678:デフォルトの名無しさん
08/11/26 11:06:22
KOUZOUTAI data[100];
partial_sort( data, data + 10 ,data+100, Sortpred1)
ってできますけど
vector<KOUZOUTAI> data(size);
partial_sort( data.begin(), data + 10 ,data.end(), Sortpred1)
ができません。第2引数の書き方が問題だと思うんですが、どう書けばいいでしょうか?
679:デフォルトの名無しさん
08/11/26 11:18:38
>>678
data.begin() + 10
680:デフォルトの名無しさん
08/11/26 12:37:31
const_iterator を iterator に変換するために distance() と advance() を使う方法が
Effective STL にありますが、この方法はランダムアクセス反復子でないと定数時間で
変換できません。
std::set の const_iterator を定数時間で iterator に変換する方法はあるでしょうか?
681:デフォルトの名無しさん
08/11/26 15:34:21
typedef std::set<A,B> C
std::set<C::const_iterator,C::iterator>
を作って変換しろ
682:デフォルトの名無しさん
08/11/26 15:46:58
>>681
std::set, std::map の検索は普通の実装で対数時間
683:デフォルトの名無しさん
08/11/26 18:49:39
*reinterpret_cast<std::set<A>::iterator*>(&cit)
大体の実装なら通るよ
細かいこと気にすんなってwwwww
684:デフォルトの名無しさん
08/11/26 20:24:23
対数時間なら別にいいんじゃね
685:デフォルトの名無しさん
08/11/27 01:02:08
>>680
とりあえず何のためにそんな変換をする破目になったのか教えてくれまいか?
686:デフォルトの名無しさん
08/11/27 01:35:37
>>680
定数時間にこだわるんならどうぞ
std::tr1::unordered_map<C::const_iterator, C::iterator>
687:デフォルトの名無しさん
08/11/30 15:23:23
vector<vector<T> > WArray;
WArray warr (100, vector<T>(10));
T型の2次元配列を作る場合、このようにすることが多いのだけど
全体のデータサイズは、size_of()関数で取得できるけど、配列の行数と列数のサイズ
を知りたい場合、方法は無いのでしょうか?
688:デフォルトの名無しさん
08/11/30 15:44:30
> 全体のデータサイズは、size_of()関数で取得できるけど、
できるか?
689:デフォルトの名無しさん
08/11/30 15:57:26
>>688
>>687です
ごめんなさい、間違えました
size_t size = warr.size();
こうでしたね(^^;
690:デフォルトの名無しさん
08/11/30 16:29:30
いや、それ全体じゃないから。
691:デフォルトの名無しさん
08/11/30 17:38:11
detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdbの解決方ありますか?
692:デフォルトの名無しさん
08/11/30 17:41:32
マルチ市ね
693:デフォルトの名無しさん
08/11/30 17:45:42
detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdb' が 'C:\Program Files\Microsoft DirectX 9.0 SDK (Summer 2004)\Lib\detours.lib'に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。これの意味と解決方教えてください
694:デフォルトの名無しさん
08/11/30 18:34:07
さっさとしね
695:デフォルトの名無しさん
08/11/30 19:02:34
大体わかるけどマルチ野郎には絶対教えない
696:デフォルトの名無しさん
08/12/04 00:08:26
こんなファイルがあって、
--
a foo FOO
a fooz FOOZ
a foz FOZ
b bar BAR
b baar BAAR
--
その場合、こんな関係を現わしているんだけど、
--
a-+-foo
+-fooz
+-foz
b-+-bar
+-baar
--
どんなデータ構造にするのが手頃か相談に乗ってくれまいか。
697:デフォルトの名無しさん
08/12/04 00:17:04
何やりたいかによるだろうが、単に vector vector ではだめなの?
698:デフォルトの名無しさん
08/12/04 00:26:09
aやbがなければvector<vector<pair<string, string>>>でいけるかな。問題は、
aかb(か他の何か)を選択した後に、fooなりなんなりを選択するってユーザインターフェースがあることなんだ。
おまけに、fooを選択したときの出力はFOO(単純に大文字って事じゃないよ)でないといけないわけで。
699:デフォルトの名無しさん
08/12/04 00:31:12
mapでいいだろ
700:デフォルトの名無しさん
08/12/04 00:32:12
楽しようと思えばmap<string,map<string, string> >かなぁ
701:デフォルトの名無しさん
08/12/04 00:51:58
>>698
なんかよくわからんが、vector<pair<>> を含む class を作れば
いいのかな。出力もメンバ関数でもできるし。
702:デフォルトの名無しさん
08/12/04 01:17:48
multimap<string,pair<string,string>>とかかな・・・
S式にした場合に(("a" ("foo" . "FOO") ("fooz" . "FOOZ")) ("b" ("bar" . "BAR") ("baar" . "BAAR")))
みたいなのを表現したいってことなら
703:デフォルトの名無しさん
08/12/04 01:34:40
struct Entry {
string type, id, name;
bool operator<(const Entry &a) const { return type < a.type; }
};
multiset<Entry> entries;
でequal_range使わせるかな
704:デフォルトの名無しさん
08/12/04 02:41:11
定数時間でa->foo->FOOと引く必要あるなら、map二段構えが一番楽じゃね。
705:696=698
08/12/04 06:11:17
レスありがと。
なるほど、色々手はありそうだね。
ちょっとmultimapとmultisetを調べて、どれにするか決めるよ。
# 昨夜のうちに決めようと思ったのに眠りこけていたのは内緒w
706:デフォルトの名無しさん
08/12/04 20:31:19
vectorを配列っぽく使ってるんですが、
eraseに渡す値はイテレータじゃなきゃ駄目なんでしょうか?
vec.erase(vec[5])
vec[5].erase()
みたいなことはできませんか?
707:デフォルトの名無しさん
08/12/04 20:34:31
begin()+5
708:706
08/12/04 20:36:56
おおー。感動です。ありがとうございました。
709:デフォルトの名無しさん
08/12/04 22:10:14
まあ使い辛いとは思うがな・・・。
710:デフォルトの名無しさん
08/12/04 22:28:47
関数の戻り値を直接 + とか . で使えることを初めて知ったときは感動したな。
とどうでもいい回顧
711:デフォルトの名無しさん
08/12/04 22:29:42
. はともかく + は・・・。
数学的に、単独の方が違和感あると思われ。
712:デフォルトの名無しさん
08/12/04 22:34:59
右辺値やな
713:デフォルトの名無しさん
08/12/05 00:12:57
for_eachの使い方を知ったときは感動したけどやっぱり使いづらい
714:デフォルトの名無しさん
08/12/05 00:21:25
lambda なしに for_each だけあってもね・・・。
715:デフォルトの名無しさん
08/12/05 10:23:09
range adapterも欲しいナ
716:デフォルトの名無しさん
08/12/05 18:00:27
rangeベースのforとアルゴリズムとlambdaだけでもwktkが止まらない
717:デフォルトの名無しさん
08/12/06 15:46:46
deque<string> buff;
にpusu_back()は定数時間ですか?それと
buff[0]みたいなアクセスはありですか?
718:デフォルトの名無しさん
08/12/06 16:32:10
「deque push_back 定数時間」でググれば、皆同じことを言っているし、
buff[0]みたいなアクセスが「あり」かどうかは自分で書いてコンパイルすればわかると思うんだが、
何故こういう質問が書き込まれるんだろう。
あと、「みたいな」っていうのがよくわからん。
それ自体だけでなく「それとはちょっと違う何らかのアクセス方法」も込みで訊ねてるのなら、
その内容次第で返答は変わるかもしれないから、もうちょっと具体的に書くべき。
もし、自分の表現に対する自信の無さゆえに「ぼかし」を加えたに過ぎないなら、
そういうのはただ単に答えにくくなるだけだから、やめたほうがいい。
答を書かないことも含めて、親切すぎて逆切れされる可能性大だな、このレス。
719:デフォルトの名無しさん
08/12/06 16:39:40
>>718
そんなのはいいから答え教えろかす
720:デフォルトの名無しさん
08/12/06 16:46:12
長々となに書いてんだろ PC触りすぎて酸素欠乏症なのかな
721:デフォルトの名無しさん
08/12/06 16:49:17
std::dequeはrandom access containerとback insertion sequenceの要件を満たしているので
operator[]によるrandom accessが可能かつ、
push_backによる要素追加は償却で定数時間であることが保証されています
722:デフォルトの名無しさん
08/12/06 17:45:09
>>720
> 長々となに書いてんだろ
馬鹿が読むと煽りたくなるアドバイスじゃない?
723:デフォルトの名無しさん
08/12/06 18:13:35
むしろpush_backが償却定数時間よりひどいコンテナなんて無いだろw
724:デフォルトの名無しさん
08/12/06 18:18:33
これらの操作を提供するための条件として規定されてるからね。
725:デフォルトの名無しさん
08/12/07 22:15:49
set とかは insert だしな。
726:デフォルトの名無しさん
08/12/09 14:44:05
vectorの2次元配列はどうすればいいんですか?
2次元目も動的にしたいんです
727:デフォルトの名無しさん
08/12/09 15:04:51
vector<vector<int> > v;
728:デフォルトの名無しさん
08/12/09 16:27:55
ありがとっ
729:デフォルトの名無しさん
08/12/09 17:01:36
これって問題ある?
class CVector
{
vector<int> A;
}
vector<CVector> B;
CVector.A.resize(10);
B.resize(10);
730:デフォルトの名無しさん
08/12/09 17:03:22
class CVector
{
vector<int> A;
}←セミコロンがない
vector<CVector> B;
CVector.A.resize(10);←クラス内の動的メンバへのアクセス方法がおかしい
B.resize(10);
731:デフォルトの名無しさん
08/12/09 17:21:46
あそうか、こうしないとインスタンスが作れなかった
class CVectorSub
{
public:
vector<int> A;
};
class CVectorMain
{
public:
vector<CVector> B;
};
class C
{
public:
CVectorSub vSub;
CVectorMain vMain;
void Resize()
{
vSub.resize(10);
vMain.resize(10);
}
};
732:デフォルトの名無しさん
08/12/09 17:24:20
やばい
2次元配列じゃなくなってる
意味ねぇ
733:デフォルトの名無しさん
08/12/09 17:39:28
あ!わかったthx!
class CVectorSub
{
public:
vector<int> A;
};
class C
{
public:
CVectorSub vSub;
vector<CVectorSub> vMain;
void Resize()
{
vSub.A,resize(100);
vMain.resize(10);
}
};
734:デフォルトの名無しさん
08/12/09 17:44:36
うわ・・・これダメだ
735:デフォルトの名無しさん
08/12/09 17:45:35
>>733
vSubを操作してもvMainに影響しないし、vMainを操作してもvSubには影響しない。
わかってるならいいんだけど。
エスパーすると
vector<vector<int> > vec;
vec.resize(10);
for(int i=0; i!=vec.size(); ++i)
{
vec[i].resize(10);
}
なんじゃないかと。
違ったら無視して。
736:デフォルトの名無しさん
08/12/09 17:56:13
いやそれです。ありがとう
それだと全部同じ配列数になるのかと思ってしまった。
vec[0].resize(10);
vec[5].resize(20);
こう出来たんだ。
暴れてしまった・・・すまんTHX
737:デフォルトの名無しさん
08/12/11 11:12:04
2次元配列の初期化とポインタの使い方あってますか?
vector<vector<int>> vec(5, vector<int>(100, 0));
vector<vector<int>>* pVec = vec;
pVec[3]->resize(200);
pVec[3][180] = 12345;
738:デフォルトの名無しさん
08/12/11 11:33:26
いいえ。
739:デフォルトの名無しさん
08/12/11 11:37:41
>>737
> vector<vector<int>>
まずこれがだめ。正しくは
vector<vector<int> >
2行目はコンパイル通らない。
3行目と4行目も意味がめちゃくちゃ。
740:デフォルトの名無しさん
08/12/11 12:27:03
ポインタをインデクサで参照して実態をアロー演算子で参照してるがな
大体はそんな流れでいいと思うが後は実際にビルドしてみるよろし
つーか何でポインタが出てくんの?w
741:デフォルトの名無しさん
08/12/11 12:35:38
何がしたいかよく分からない例だが
そのまま直すとこんな感じか
vector< vector<int> > vec(5, vector<int>(100, 0));
vector< vector<int> > *pVec = &vec;
(*pVec)[3].resize( 200 );
(*pVec)[3][180] = 12345;
しかしvectorに直接vector入れたらりサイズのコストがやばそうだな^^;
742:デフォルトの名無しさん
08/12/11 12:44:08
ありがと。
本2冊読んで> >の間のスペースがわからないのがやばい
vector<vector<int> > vint;
vector<vector<char> > vchar;
ごめん↑を分岐なしで使えるようにするためにポインタに入れたかったんだけど
vector<vector>* pvec = char;
ここの書き方がわからないお願い!
743:デフォルトの名無しさん
08/12/11 13:06:59
そこでテンプレート関数の出番ですよ
main()
{
vector< vector<int> > vint;
vector< vector<char> > vchar;
if(〜〜〜)
test(vint);
else
test(vchar);
}
templete<class T>
test(T &vector)
{
vector[3].resize(200);
vector[3][180] = 12345;
}
適当に書いたから間違ってるかも分からん
744:デフォルトの名無しさん
08/12/11 13:27:33
>>742
共通のクラスを継承してない限り、型の違いをポインタでは吸収できない。
なので>>743の方法になる。
745:デフォルトの名無しさん
08/12/11 13:40:36
いや何を書いてあるのかがわからなかった
コンテナの前にテンプレートを勉強してくる
ありがと、まじありがとっ
746:デフォルトの名無しさん
08/12/11 13:45:38
今更勉強するより0xまで待った方がいいかもなー
747:デフォルトの名無しさん
08/12/11 23:41:07
それは0x完全対応コンパイラを待ってから勉強するってこと?
あ、老後の楽しみか
748:デフォルトの名無しさん
08/12/12 06:28:40
なに微妙に興奮してんのw
749:デフォルトの名無しさん
08/12/12 07:10:55
>>748
オ○ニーしながらだからねw
750:デフォルトの名無しさん
08/12/12 09:04:47
上級者すぐるw
751:デフォルトの名無しさん
08/12/13 01:33:45
[SourceForge.net: Project File Releases: STLport] STLport STLport-5.2.1 released (Wed, 10 Dec 2008 10:50:47 GMT) (2008-12-10 19:50)
752:デフォルトの名無しさん
08/12/13 10:34:59
0x ってもうあと一年しか残ってないんだ
753:デフォルトの名無しさん
08/12/13 12:13:07
もしかして 09 でなくて 0xa だったりして
754:デフォルトの名無しさん
08/12/13 12:24:32
すみません、c++のカスタムアロケータでの質問なんですが
カスタムアロケータとしてmy_allocatorを作り、
それを指定したbasic_stringを
typedef basic_string<char, char_traits<char>, my_allocator<char> > my_string;
と定義しました。
それでやりたいことなんですが
my_string ms = "ms test";
std::string ss = "ss test";
ms = ss;
と、アロケータの違うコンテナ同士で代入をしたいのです。
今はとりあえず
my_string ms = "ms est";
std::string ss = "ss test";
ms = ss.c_str();
としてますが、ちょっと不恰好で気になってしまいます。
なにかスマートな方法はありますでしょうか?
755:デフォルトの名無しさん
08/12/13 12:50:12
assert(ms.size() >= ss.size());
std::copy(ss.begin(), ss.end(), ms.begin());
756:デフォルトの名無しさん
08/12/13 13:04:10
おぉなるほど、イテレータを使えばいいんですね。
ありがとうございます。参考にして作ってみます。
757:デフォルトの名無しさん
08/12/13 13:19:49
ss.assign(ms.begin(), ms.end());
758:デフォルトの名無しさん
08/12/15 18:59:03
STLの仕様とかよく理解できてないから根本的におかしいかもだけど、
map< HWND, LPFUNC >みたいな使い方ってダメなんでしょうか。 (LPFUNCは関数へのポインタ型)
コンパイルは通るんですが、insert()すると必ず失敗してしまいます。
759:デフォルトの名無しさん
08/12/15 19:12:31
失敗ってどんな?
760:758
08/12/15 19:15:39
>>759 insert()したときの戻り値の.secondが必ずfalseになる
761:デフォルトの名無しさん
08/12/15 20:35:44
エラーが起きる最小限のソース貼ってみ
762:758
08/12/15 21:15:36
↓にうpしときました
URLリンク(www3.uploda.org)
Passはstlです
一応環境も書いときます
WinVista SP1
VS9
763:デフォルトの名無しさん
08/12/15 22:26:08
一時オブジェクト?
764:デフォルトの名無しさん
08/12/15 22:45:41
>>762
URLリンク(msdn.microsoft.com)
CreateWindowは呼び出しから戻る前にいくつかのメッセージをsendする。
insertする前にWndProcのhoge[hWnd]で要素が追加されてるから失敗する。
765:758
08/12/15 22:46:02
ローカルのものをmapにはinsert出来ないということですか?
766:デフォルトの名無しさん
08/12/15 23:01:01
764が言ってるのは、
自分でinsertを呼ぶよりも前に、WndProcが呼ばれて
LPFUNC lpfn = hoge[ hWnd ];
で、hWndに対応する関数ポインタがヌルとして登録されてしまうってことでしょ
767:758
08/12/15 23:11:12
なるほどやはり詳細な仕様を知らないで使うとへんなとこでバグになりますねー。
つまり、findでイテレータを探して、そのイテレータの指す先が有効だった場合にlpfnに代入すればいいということでしょうか。
768:デフォルトの名無しさん
08/12/15 23:12:11
>>765
つ
// LPFUNC lpfn = hoge[ hWnd ];
// if ( lpfn ) return ( lpfn )( hWnd, msg, wParam, lParam ) ? 0 : E_FAIL;
これでinsertは成功
769:デフォルトの名無しさん
08/12/15 23:18:39
わざわざエラー検査する必要ないのでは?
hoge[ hWnd ]=lpfn;
でいいじゃない
770:758
08/12/15 23:25:16
無事解決しました。>>764 >>766 >>768ありがとでした。
ちょっとSTL関係の本を探して勉強しなおしてきますw
771:デフォルトの名無しさん
08/12/16 12:17:45
STLというよりWindowsAPI、ウィンドウ生成周りの勉強だと思う
772:758
08/12/16 17:26:11
CreateWindowが幾つかメッセージ送るのは知ってたんですが、
find()使わないでoperator[]使うと存在しないキーを参照しようとしたときに、
対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4678日前に更新/158 KB
担当:undef