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


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

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



1 名前:デフォルトの名無しさん [2008/02/27(水) 02:03:30 ]
C++標準ライブラリの一つ、STLについて。

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

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

596 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 12:19:01 ]
>>590
とりあえずboost本買ってみるのは

597 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:49:33 ]
>>592
where句が限定されているならmapでいいんじゃないの?
っていうかDB的に使うなら普通にsqliteでも使った方が無難だよ。


598 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 15:20:14 ]
O/Rマッパーが欲しいんじゃね
DataSetとか

599 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:37:03 ]
mapは、要素の追加または削除を行ってもそれ以外の要素の参照は保たれたままな事が保証されていますか?

600 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:38:01 ]
追記です。要素への参照の他に、キーのについても同じ事が言えますか?

601 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:40:26 ]
自己解決しました。ありがとうございました。

602 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:09:11 ]
死ね

603 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:43:37 ]
死ねっていう奴と
死ねって言われた奴は
死ねばいいのに

604 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:59:17 ]
そして伝説へ・・・



605 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:06:56 ]
死んでもそれ以外の人の参照は保たれたままな事が保証されていますか?

606 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:00:47 ]
死して屍拾う者なし、ってメモリリークのことですか?

607 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 08:44:19 ]
GC「骨くらいは拾っておいてやるよ」

608 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 08:45:30 ]
デストラクタ「生ける者の為の卒塔婆」

609 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:11:39 ]
std::mapのイテレータに順ずるものから、木構造の右部分木、左部分木をそれぞれ取得して
木を追跡したいんですが、そういうことは可能でしょうか?

610 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:13:10 ]
赤黒木使ってたら左部分木と右部分木だけとは限らないよ
アルゴリズムの本読んでみ

611 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:17:24 ]
>>609
std::map が木で実装されているとは限らないので、そういう操作は無い。

木の追跡(?)自体がやりたいわけじゃないと思うんだけど、結局のところ何がしたいの?

612 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:26:33 ]
>>611
upper/lower_boundで解決しました。

613 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:36:39 ]
やっぱり解決しませんでした。もういいです諦めます。STL死ね。

614 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:41:17 ]
お前が死ね



615 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 14:21:17 ]
すぐファビョる所を見ると朝鮮人か

616 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 14:23:03 ]
私が死ぬのであなた達は死ななくてもよいのです

617 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 15:05:12 ]
STLは生き物ではないので死ぬことはできません

618 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 15:18:03 ]
私のお墓の前で泣かないでください

619 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 15:46:50 ]
STLの考え方に頭が付いていかない所を見ると
頭が悪いかジジイかのどちらかだろう

620 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:07:29 ]
お尋ねします。
vector<vector<bool>> TempA;
vector<vector<bool>>::iterator itr1;
vector<vector<bool>>::iterator itr2;
と宣言したとします。
itr1 = TempA.begin();
itr2 = TempA.begin();
としたのち、
TempAのたとえば2行目と3行目の中身すべてを比較したいとき、
itr1++;itr2 += 2;としてiteratorを進めて、
*itr1 == *itr2の比較を一度行えばいいのでしょうか?
それとも、各行でiteratorを作成して、
各行ベクトルの列座標に対応したiteratorを回す必要がありますか?

p.s.この動作のあと、一致している行を、
itr2=Temp.erase(itr2);
みたいに削除したいのです。

621 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:34:38 ]
>>620
要するに二つのvectorを==で比較できるかってことだよな
できるよ

622 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:46:22 ]
>>621
ありがとうございます。
行に対応するvectorの各要素の比較という認識で大丈夫でしょうか。

623 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:17:13 ]
そう。要素ごとに==で比較してる

624 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:19:40 ]
>>622
23.1 Container requirements に
a == b は a.size() == b.size() && equal(a.begin(), a.end(), b.begin())
と等価と書いてある。



625 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:12:31 ]
>613
map使わずにソート済vector使えばいいんじゃね?

626 名前:620 mailto:sage [2008/06/05(木) 10:43:24 ]
>>623
亀レス申し訳ない。
ありがとうございました。

そういう情報ってどのヘッダーを見ればいいんでしょうか?
vector.hを眺めていてもさっぱりです…。

627 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:34:56 ]
>>626
ヘッダーには書いてないだろう・・・
お使いのコンパイラのリファレンスマニュアル等を読め
VCならこのへん↓
msdn.microsoft.com/en-us/library/5asks2ba(VS.80).aspx

628 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:25:16 ]
>>626
C++の規格書一回読んでみるのもいい。

629 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:20:37 ]
vectorかその内部でincludeしてるファイルに書いてあるんじゃね。実装が。

630 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:17:16 ]
イテレータを返すbegin, endが、どうして戻り値の型が違うだけで(iterator, const_iterator)オーバーロードされた関数を特定できるのかが分かりません。
自分で同じ様な事をしようとしてもSTLとは違いコンパイラが関数を特定できずに失敗します。

631 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:22:06 ]
>>630
戻り値の型じゃなくて、引数リストの後ろの const の有無が違う。

632 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:36:05 ]
>>631
それは実装側のbegin, endの定義ですよね?
自分で作ったものもconst_iteratorを返すものは引数リストの後にconstをつけているんですが、
これは利用する側が呼び出すときには特に関係ない様です。
まさか container_type::const_iterator it = ((container_type::const_iterator (container_type::*)()const)container.begin)();
なんてしなきゃいけないんですか?

633 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:24:47 ]
iteratorからconst_iteratorへの変換はできるようになってる?

634 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:27:59 ]
変換できるようにしたら const_iterator begin() const の必要性なくならないか?



635 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:31:44 ]
なんで?
constなインスタンスに対してイテレータ取得できなくなっちゃうじゃん

636 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:59:04 ]
VC7

template<class _Ty,class _Alloc>
class _Vector_iterator : public _Vector_const_iterator<_Ty, _Alloc>

637 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 19:44:07 ]
>>636
補足しとくと、iteratorは基底クラスであるconst_iteratorに変換できるといいたいだけ。
constなしbegin()の戻り値はiteratorだからconst_iteratorにも変換されうる。

begin()の戻り値を渡す先がconst_iteratorかiteratorかで、
begin()の種類(後ろにconst付きか否か)が選択されているわけじゃない。

638 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:14:29 ]
>>632
MyContainer c = ...
MyContainer const& cc = ...
MyContainer::const_iterator = c.begin();
MyContainer::const_iterator = cc.begin();

これをトレースするといいよ。

639 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:30:21 ]
なるほど、constなメンバ関数はオブジェクトがconstな時に使用されるんですね。

640 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:26:16 ]
constメンバ関数と非constメンバ関数が両方ともある場合はそうなる。
非constメンバ関数がない場合は非constオブジェクトからもconstメンバ関数が呼ばれる。

641 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:31:07 ]
\n とか \r\n とかが入った文字列を SetDlgItemTextすると
char のときはちゃんと改行してるのに string だと改行されずに何も表示されないわけですが
string って \n とかとは別に改行とかタブコードがあるんでしょうか?

642 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:40:55 ]
実際のコード貼ってみれ

643 名前:641 mailto:sage [2008/06/13(金) 21:37:36 ]
あははははは!!!!!
エディットコントロールのマルチラインがFalseなだけだった
俺市ねw

644 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:13:13 ]
641は死んだの?



645 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:49:25 ]
>>644
今日までの641は氏に、また一歩成長したプログラマーとして生まれ変わるのです。

646 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:34:34 ]
>>645が良い事言った

647 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:25:44 ]
フェニックスシングルトンなわけですね。

648 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:30:12 ]
シングルトンを真面目に考えるとややこしい事限りないなあ。

649 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:31:25 ]
非常に優秀なデザインパターンの1つだと思うな

650 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:36:29 ]
インスタンスの数が1個に限定される分、むしろ単純にならないか?

651 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:39:16 ]
Modern C++ Design を読むと
シングルトンのややこしさがよく分かる。
Scala みたいに言語的にサポートしてくれればいいんだが。

652 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:48:11 ]
作るのはいいけど削除のタイミングが面倒くさいんだよね。

653 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:53:21 ]
いつでもnewdelete出来るように改良した、って自慢げに変なシングルトン使いまくる奴ならいたな

654 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:58:26 ]
deleteしたら自動的に新しいインスタンスが作られて、
newしたら自動的に今あるインスタンスが削除されるシングルトン



655 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:51:25 ]
>言語的にサポート
使う人間のスキルへの依存度が高いC++に期待してはいけないものだよ。

656 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:59:25 ]
シングルトンて心太に似てるよね

657 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 18:36:28 ]
STLを軽く弄るためにこのスレを覗きにくるC++ビギナーはフェニックスシングルトンとModernC++Designをどうやって関連付けて考えるだろうか。

658 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 18:37:22 ]
「スレ違い」 と関連づけて考える事だろう

659 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:42:54 ]
mapはどうやってfindなどで入力されたキーが木にあるキーと同じかどうかを見るんでしょうか?
比較関数ならstd::less<T>がデフォルトで入っていてこいつを使えば良いと分かるんですか、
これと同じ様に一致関数をテンプレート引数で指定できませんか?

660 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:45:23 ]
比較関数をltとすると、
!lt(x, y) && !lt(y, x)
で一致判定してる

661 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:46:43 ]
マップのキーは、その比較関数を使って一致を判断する
!(a < b) && !(b < a) なら a と b は一致していることになる

662 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:12:24 ]
そして等価と等値の話が始まる。

663 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 22:07:44 ]
重要な概念だしな

664 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 09:53:59 ]
そしてEffective STL が売れる



665 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 10:08:08 ]
そして日本語版Modern C++ Designが叩かれる。

666 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:05:30 ]
ListとかVectorってスレッドセーフですか?
複数のスレッドからイテレータ取得してアクセスしたりするなら
シグナルやミューテクスでロックしてからアクセスするべきですか?


667 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:10:46 ]
そうですね。

668 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:16:56 ]
>>666
実装次第。
各処理系のマニュアルを読むよう。

669 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:29:14 ]
STLportでぐぐらない方が良い。

670 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:02:10 ]
スレッドセーフなのか?という問いに答える者はいなかったといふ


671 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:04:49 ]
実装次第だし。

672 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:09:48 ]
スレッドセーフではない と一律で答えておいたほうが面倒がない

673 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:24:55 ]
Camelなリストやベクタはスレチ。

674 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:43:27 ]
というか、「スレッド」の概念が標準C++にあるんだっけ?



675 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:54:49 ]
ございません

676 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 22:07:35 ]
スレッドの概念が無いから「スレッドセーフでない」という概念も無い。

677 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 22:15:17 ]
C++0xにご期待下さい

678 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 02:26:33 ]
>>670 >>531-540

679 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:08:47 ]
コンテナの範囲外にイテレータがインクメントされてしまってもコンテナを自動で拡張し、
あたかも未だに範囲内を指している様に振舞うイテレータってのがあると思うんですけど
実際はなくてただの思い過ごしだったりしますか?しなかった場合はそれが何なのか教えてください。

680 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:22:49 ]
insert_iteratorのことを言ってるのかな。

681 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:35:13 ]
自己解決もしたし意味不明な書き込みなんてみんな無視してくれるだろうと思っていたら教えてくれている人が居た。
ありがとう。

682 名前:デフォルトの名無しさん [2008/06/20(金) 15:05:13 ]
std::vector<std::string> v1;

みたいなインスタンスをシリアライズ化したいんですけど、単純に

FILE *fp = fopen("vec.bin", "wb");
fwrite(&v1, sizeof(v1), 1, fp);
fclose(fp);

みたいに書き込めば良いんですかね?
そして戻すときは、逆に

std::vector<std::string> v1;
char* buf = (char*)&v1;
FILE *fp = fopen("vec.bin", "rb");
while(fread(buf++, 1, 1, fp) > 0);
fclose(fp);

みたいな感じでいいんですかね?
STLのインスタンスのシリアライズ化で、もっと適切な方法があったら教えてください。

683 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:33:55 ]
vectorの内部にはポインタも含まれるから
オブジェクトの性質を考えてPOD型のデータまで落としこまないとダメだろう

684 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:38:38 ]
vectorの扱う型ががフリーストアを使ってないという保証があればあるいは



685 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:46:36 ]
boost::serialization使うって手も <あまり使いやすくは無い

686 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:45:27 ]
VS2005では一応下のコードは正常に動きました。
とりあえずこれが動けば十分です。

std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
fwrite(&v1, sizeof(v1), 1, fp);
fclose(fp);

std::vector<std::string> v2;
char* buf = (char*)&v2;
fopen_s(&fp, "vec.bin", "rb");
while(fread(buf++, 1, 1, fp) > 0);
fclose(fp);

687 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:53:25 ]
>>686
まてまて、それv1の確保したメモリアドレスをv2が指しているだけだろ。
終了時に2重解放でエラーになってないか?

688 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:54:48 ]
と思ったら、デストラクタで怒られました。
何がいけないんだろう・・・

689 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:58:00 ]
上の人も書いてるけどvectorは内部にポインタを持ってるんだってば。
(ついでにstringもな)
fwriteでv1を直書きすると、ポインタのアドレスが保存されるだけで、
ポイント先は保存されないんだよ。

690 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:00:54 ]
>>687,689
どうすればいいでしょうか。

やりたいことは、カンマ区切りで並んでいる大量の文字列データがあって、
それをカンマの区切りを探しつつ読み込むと非常に時間がかかるので、
初回だけカンマ区切りを解釈したら、その後はインスタンスをバイナリで一気に保存、一気に復元したいのです。

691 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:04:45 ]
vector使わずに配列を使えばいいんでしょうが、vectorのデータをシリアライズ化するということは
ニーズとしてあるはずなので、そういう手法があれば教えていただきたいのです。
ただシリアライズのためにboostという別ライブラリを使用するのは、ちょっと大げさすぎかなと。。
そこまでするなら配列でやります。

692 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:10:08 ]
自分の力量・理解度に応じた実装をするべし

693 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:11:11 ]
最低限のデータを保存したい場合はこうじゃない?

std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
const char *pstr;
fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存
for(size_t c=0, e=v1.size(); c < e; c++) {
 pstr = v1[c].c_str();
 fwrite(pstr, strlen(pstr), 1, fp);
}
fclose(fp);


694 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:21:42 ]
stringのサイズ保存してなかったので訂正
書き込み

std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存
size_t size;
for(size_t c=0, e=v1.size(); c < e; c++) {
 size = v1[c].size();
 fwite(&size, sizeof(size), 1, fp);
 fwrite(v1[c].c_str(), size, 1, fp);
}
fclose(fp);



695 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:28:10 ]
読み込み

std::vector<std::string> v2;
FILE *fp;
fopen_s(&fp, "vec.bin", "rb");
size_t size;
fread(&size, sizeof(size), 1, fp);
v2.resize(size);
for(size_t c=0, e=size; c < e; c++) {
 fread(&size, sizeof(size), 1, fp);
 v2[c].resize(size);
 fread(&v2[c][0], size, 1, fp);
 //stringの確保するメモリが連続してない環境なら、一度vectorなりに読み込む必要が
 //あるが、vcなら問題ないので省略
}
fclose(fp);

696 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:33:26 ]
最初にもちらっと書いたが、serialization使うとこれですむ

//保存
{
vector<string> data;
data.push_back("Hello");
data.push_back("World");

ofstream file("save.dat");
boost::archive::text_oarchive oa(file);
oa << (const vector<string>&) data;
}

// 復元
{
vector<string> data;

ifstream file("save.dat");
boost::archive::text_iarchive ia(file);
ia >> data;
}

下準備がちょっと面倒だけどな。
興味あったら下記を参照してください。
ttp://www.kmonos.net/alang/boost/classes/serialization.html






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

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

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