[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 04/29 14:24 / Filesize : 158 KB / Number-of Response : 773
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 12:01:17 ]
C++標準ライブラリの一つ、STLについて。

前スレ
【C++】STL(Standard Template Library)相談室 9
pc11.2ch.net/test/read.cgi/tech/1204045410/

過去ログ・リンク・書籍紹介は >>2 以降

652 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:26:38 ]
>>651
私のケースでは、挿入・削除を行う位置は先頭・末尾でないことが圧倒的に多いのです。

653 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:41:22 ]
>>652
dequeは途中の挿入も(そこそこ)速いんだよ。
dequeの仕様を満たそうとすると、どうしてもそういう実装になる。

654 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:02:08 ]
>>650
要件がいまいちつかめないので何ともいえないけど、
規格を眺めてlistが最適だと思うなら仕方がないんじゃない?
listはランダムアクセス出来ないしね。

でも、std::advanceの認識からしてSTLの理解甘そうだし、もう一度規格眺めることをおすすめするよ

655 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:14:47 ]
>>652
要素の連続性がいらないがアクセスがランダム性高い状態ならdequeにしとけ


656 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:39:03 ]
周りがアドバイスしても結局自分の方法に固執するんじゃ
何言っても意味ないよ
そういうのはほっとくに限る

657 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:44:27 ]
挿入/削除が多いならリストを使うべきだろ
ときどきランダムアクセスが必要ならstd::advanceで

658 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:51:51 ]
advanceを思いっきり勘違いしてる節があるよね

659 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:58:49 ]
>>655
配列要素数が数万個以下の場合は、dequeよりむしろvectorの方が速かった。
VS2005でコンパイルした場合だけど。

660 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:05:31 ]
>>659
何が?



661 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:28:06 ]
用途によっては挿入/削除/ランダムアクセスが全部O(log n)のデータ構造も検討するといいかもな
STLにはないけど

662 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:31:05 ]
>>647より後の返答カキコ 本当に>>647なのか?
おまえら、誰かに釣られてないか?
IDのない板って、なりすまし可能だからな

663 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:35:42 ]
質問に答えてるだけなんだから、>>647>>650が同一人物であろうとなかろうと何も関係ない
釣りだったとしても痛くも痒くもない

664 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:03:28 ]
std::vector<要素 *>

665 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:30:10 ]
skip listか
んなもんわざわざ使うなら普通にlistでもいいと思うけどな

666 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:40:43 ]
setについて質問です
www5c.biglobe.ne.jp/~ecb/cpp/07_15.html
要素の追加(追加場所をイタレーターで指定) 定数時間

とありますが、追加場所をイタレーターで指定とはどういうことですか?
insert関数ではないですよね?

667 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:02:51 ]
>>647はlistを使うのを前提として質問していて
listの代わりに何が良いかは質問してないようによめるのだが

668 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:04:52 ]
>>666
insertのことだと思うが

669 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:11:14 ]
>>666
setにはイテレータを指定するinsertと指定しないinsertがあるよ

670 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:15:27 ]
vectorにそのままクラスを入れるとコピーコンストラクタを何度も呼び出してるようなので
クラスのポインタを入れて使おうかと思ってるのですが
何か注意しなければ行けない点はありますか?



671 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:17:35 ]
>>670
ないです。

672 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:18:02 ]
あります
vectorから取り除いたときのdeleteし忘れ

673 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:20:48 ]
>>670
オブジェクトの多重参照

674 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:54:32 ]
FUGAはduobleとstringのpairです

multiset<FUGA> huga;
にいくつかデータが入っています。これからある文字列(stiring)の数をカウントしたいんですがどうすればいいでしょうか?


count関数がありますけど使い方が・・・

huga.count("hogehoge");みたいな感じで使いたいんです

675 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 22:04:16 ]
>>674
count_if()

676 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:21:30 ]
>>671-673
サンクス deleteしなきゃだったんだな
ありがとう

677 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:50:01 ]
>>670
ptr_vectorでも使えば

678 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 11:18:38 ]
>>678
data.begin() + 10

680 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 12:37:31 ]
const_iterator を iterator に変換するために distance() と advance() を使う方法が
Effective STL にありますが、この方法はランダムアクセス反復子でないと定数時間で
変換できません。
std::set の const_iterator を定数時間で iterator に変換する方法はあるでしょうか?



681 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:34:21 ]
typedef std::set<A,B> C
std::set<C::const_iterator,C::iterator>
を作って変換しろ

682 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:46:58 ]
>>681
std::set, std::map の検索は普通の実装で対数時間

683 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 18:49:39 ]
*reinterpret_cast<std::set<A>::iterator*>(&cit)

大体の実装なら通るよ
細かいこと気にすんなってwwwww

684 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 20:24:23 ]
対数時間なら別にいいんじゃね

685 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:02:08 ]
>>680
とりあえず何のためにそんな変換をする破目になったのか教えてくれまいか?

686 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:35:37 ]
>>680
定数時間にこだわるんならどうぞ
std::tr1::unordered_map<C::const_iterator, C::iterator>

687 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:23:23 ]
vector<vector<T> > WArray;
WArray warr (100, vector<T>(10));
T型の2次元配列を作る場合、このようにすることが多いのだけど
全体のデータサイズは、size_of()関数で取得できるけど、配列の行数と列数のサイズ
を知りたい場合、方法は無いのでしょうか?

688 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:44:30 ]
> 全体のデータサイズは、size_of()関数で取得できるけど、

できるか?

689 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:57:26 ]
>>688
>>687です
ごめんなさい、間違えました
size_t size = warr.size();
こうでしたね(^^;

690 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 16:29:30 ]
いや、それ全体じゃないから。



691 名前:デフォルトの名無しさん [2008/11/30(日) 17:38:11 ]
detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdbの解決方ありますか?

692 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 17:41:32 ]
マルチ市ね

693 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 18:34:07 ]
さっさとしね

695 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 19:02:34 ]
大体わかるけどマルチ野郎には絶対教えない

696 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:17:04 ]
何やりたいかによるだろうが、単に vector vector ではだめなの?

698 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:26:09 ]
aやbがなければvector<vector<pair<string, string>>>でいけるかな。問題は、
aかb(か他の何か)を選択した後に、fooなりなんなりを選択するってユーザインターフェースがあることなんだ。
おまけに、fooを選択したときの出力はFOO(単純に大文字って事じゃないよ)でないといけないわけで。

699 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:31:12 ]
mapでいいだろ

700 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:32:12 ]
楽しようと思えばmap<string,map<string, string> >かなぁ



701 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:51:58 ]
>>698
なんかよくわからんが、vector<pair<>> を含む class を作れば
いいのかな。出力もメンバ関数でもできるし。

702 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 01:17:48 ]
multimap<string,pair<string,string>>とかかな・・・
S式にした場合に(("a" ("foo" . "FOO") ("fooz" . "FOOZ")) ("b" ("bar" . "BAR") ("baar" . "BAAR")))
みたいなのを表現したいってことなら

703 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 02:41:11 ]
定数時間でa->foo->FOOと引く必要あるなら、map二段構えが一番楽じゃね。

705 名前:696=698 mailto:sage [2008/12/04(木) 06:11:17 ]
レスありがと。

なるほど、色々手はありそうだね。
ちょっとmultimapとmultisetを調べて、どれにするか決めるよ。

# 昨夜のうちに決めようと思ったのに眠りこけていたのは内緒w

706 名前:デフォルトの名無しさん [2008/12/04(木) 20:31:19 ]
vectorを配列っぽく使ってるんですが、
eraseに渡す値はイテレータじゃなきゃ駄目なんでしょうか?

vec.erase(vec[5])
vec[5].erase()

みたいなことはできませんか?

707 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 20:34:31 ]
begin()+5

708 名前:706 mailto:sage [2008/12/04(木) 20:36:56 ]
おおー。感動です。ありがとうございました。

709 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:10:14 ]
まあ使い辛いとは思うがな・・・。

710 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:28:47 ]
関数の戻り値を直接 + とか . で使えることを初めて知ったときは感動したな。
とどうでもいい回顧



711 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:29:42 ]
. はともかく + は・・・。
数学的に、単独の方が違和感あると思われ。

712 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:34:59 ]
右辺値やな

713 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 00:12:57 ]
for_eachの使い方を知ったときは感動したけどやっぱり使いづらい

714 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 00:21:25 ]
lambda なしに for_each だけあってもね・・・。

715 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 10:23:09 ]
range adapterも欲しいナ

716 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:00:27 ]
rangeベースのforとアルゴリズムとlambdaだけでもwktkが止まらない

717 名前:デフォルトの名無しさん [2008/12/06(土) 15:46:46 ]
deque<string> buff;


にpusu_back()は定数時間ですか?それと

buff[0]みたいなアクセスはありですか?

718 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:32:10 ]
「deque push_back 定数時間」でググれば、皆同じことを言っているし、
buff[0]みたいなアクセスが「あり」かどうかは自分で書いてコンパイルすればわかると思うんだが、
何故こういう質問が書き込まれるんだろう。

あと、「みたいな」っていうのがよくわからん。
それ自体だけでなく「それとはちょっと違う何らかのアクセス方法」も込みで訊ねてるのなら、
その内容次第で返答は変わるかもしれないから、もうちょっと具体的に書くべき。
もし、自分の表現に対する自信の無さゆえに「ぼかし」を加えたに過ぎないなら、
そういうのはただ単に答えにくくなるだけだから、やめたほうがいい。

答を書かないことも含めて、親切すぎて逆切れされる可能性大だな、このレス。

719 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:39:40 ]
>>718
そんなのはいいから答え教えろかす

720 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:46:12 ]
長々となに書いてんだろ PC触りすぎて酸素欠乏症なのかな



721 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:49:17 ]
std::dequeはrandom access containerとback insertion sequenceの要件を満たしているので
operator[]によるrandom accessが可能かつ、
push_backによる要素追加は償却で定数時間であることが保証されています

722 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 17:45:09 ]
>>720
> 長々となに書いてんだろ
馬鹿が読むと煽りたくなるアドバイスじゃない?

723 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:13:35 ]
むしろpush_backが償却定数時間よりひどいコンテナなんて無いだろw

724 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:18:33 ]
これらの操作を提供するための条件として規定されてるからね。

725 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 22:15:49 ]
set とかは insert だしな。

726 名前:デフォルトの名無しさん [2008/12/09(火) 14:44:05 ]
vectorの2次元配列はどうすればいいんですか?
2次元目も動的にしたいんです

727 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 15:04:51 ]
vector<vector<int> > v;

728 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:27:55 ]
ありがとっ

729 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:01:36 ]
これって問題ある?

class CVector
{
  vector<int> A;
}

vector<CVector> B;


CVector.A.resize(10);
B.resize(10);

730 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:03:22 ]
class CVector
{
  vector<int> A;
}←セミコロンがない

vector<CVector> B;


CVector.A.resize(10);←クラス内の動的メンバへのアクセス方法がおかしい
B.resize(10);



731 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:24:20 ]
やばい
2次元配列じゃなくなってる
意味ねぇ

733 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:44:36 ]
うわ・・・これダメだ

735 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:56:13 ]
いやそれです。ありがとう
それだと全部同じ配列数になるのかと思ってしまった。
vec[0].resize(10);
vec[5].resize(20);
こう出来たんだ。
暴れてしまった・・・すまんTHX

737 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:33:26 ]
いいえ。

739 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:37:41 ]
>>737
> vector<vector<int>>
まずこれがだめ。正しくは
vector<vector<int> >

2行目はコンパイル通らない。
3行目と4行目も意味がめちゃくちゃ。

740 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:27:03 ]
ポインタをインデクサで参照して実態をアロー演算子で参照してるがな
大体はそんな流れでいいと思うが後は実際にビルドしてみるよろし

つーか何でポインタが出てくんの?w



741 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:44:08 ]
ありがと。
本2冊読んで> >の間のスペースがわからないのがやばい

vector<vector<int> > vint;
vector<vector<char> > vchar;
ごめん↑を分岐なしで使えるようにするためにポインタに入れたかったんだけど
vector<vector>* pvec = char;
ここの書き方がわからないお願い!



743 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:27:33 ]
>>742
共通のクラスを継承してない限り、型の違いをポインタでは吸収できない。
なので>>743の方法になる。

745 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:40:36 ]
いや何を書いてあるのかがわからなかった
コンテナの前にテンプレートを勉強してくる
ありがと、まじありがとっ

746 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:45:38 ]
今更勉強するより0xまで待った方がいいかもなー

747 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 23:41:07 ]
それは0x完全対応コンパイラを待ってから勉強するってこと?
あ、老後の楽しみか


748 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 06:28:40 ]
なに微妙に興奮してんのw

749 名前:デフォルトの名無しさん [2008/12/12(金) 07:10:55 ]
>>748
オ○ニーしながらだからねw

750 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 09:04:47 ]
上級者すぐるw



751 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 10:34:59 ]
0x ってもうあと一年しか残ってないんだ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<158KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef