【C++】STL(Standard ..
[2ch|▼Menu]
369:デフォルトの名無しさん
05/12/09 12:23:24
Boost.Spirit フレームワークで、簡単お手軽CSVパーサを作れば
かなりイイ感じだが、>>345 は、「Boost を使わず」といってるし…

370:デフォルトの名無しさん
05/12/09 12:56:16
>>364
詳細きぼん。

マルチバイト文字に関しては
> Common usage of CSV is US-ASCII, but other character sets defined
> by IANA for the "text" tree may be used in conjunction with the
> "charset" parameter.

ってあるし、改行に関しても

> As per section 4.1.1. of RFC 2046 [3], this media type uses CRLF
> to denote line breaks. However, implementors should be aware that
> some implementations may use other values.

とある。別に制限するものではないと思うけど。

371:デフォルトの名無しさん
05/12/09 13:42:54
>>370
> 別に制限するものではないと思うけど。

このメディアタイプではCR LFのみだよ。
曖昧にしたら駄目じゃん。いまさらRFCにする意味が半減。

ローカルシステムはCRのみやLFのみかもしれないから、
実装する奴は気をつけろって事。

世間では色々乱れてるから、このメディアタイプ定義で
(インターネット上での)データ交換の規準ができた。


372:デフォルトの名無しさん
05/12/09 13:45:12
↓これね。

4.1.1. 行分断(改行)の表現

MIME"text"サウブタイプの正式書式は、必ずCRLF列(連続体)として行分断を
表現しなければなりません。同じ様にMIME"text"でのCRLFの出現は如何なるも
のでも行分断を表現します。行分断以外でのCRとLFの使用も禁じられています。

この規則は、書式もしくは文字セットもしくは含まれている設定に関わらず、
適用されます。

URLリンク(www.asahi-net.or.jp)

373:デフォルトの名無しさん
05/12/14 11:18:38
ポインタのlistのsortの仕方が分からないよ!

class MyClass {
int value;
bool operator<(const MyClass& o) {
return value < o.value;
}
};

template<class T>
class ptr_less
{
public:
inline bool operator()(T left, T right)
{ return (*left) < (*right); }
};

int main() {
std::list<MyClass *> mylist;
// 色々と要素挿入(省略)
std::sort(mylist.begin(), mylist.end(), ptr_less<MyClass *>());
}

エラーが一杯出る…

374:デフォルトの名無しさん
05/12/14 11:31:29
mylist.sort()

list に std::sort は使えないんじゃ

375:デフォルトの名無しさん
05/12/14 11:34:55
>>373
list.sort();

376:デフォルトの名無しさん
05/12/14 11:37:23
>>373
もうちと付け足す。std::sort()は、random access iteratorを要求している。
しかし、std::list::iteratorは、bidirectional iterator なので、コンパイルが
通らない。

それでは使い勝手が悪いので、std::list::sort()が用意されている。こちらは
マージソートが歴史的な理由から採用されており、bidirectional iterator
でも動くようになっている。

377:373
05/12/14 12:38:31
どうもありがとう!
でも、mylist.sort(ptr_less<MyClass *>());とやると、

error C2664: 'void __thiscall std::list<class MyClass *,class std::allocator
<class MyClass *> >::sort(struct std::greater<class MyClass *>)'
: 1 番目の引数を 'class ptr_less<class MyClass *>' から 'struct std::greater
<class MyClass *>' に変換できません。 (新しい機能 ; ヘルプを参照)
コンストラクタはソース型を持てません、またはコンストラクタのオーバーロード レゾリューションがあいまいです。

というお叱りが。std::greaterしか受け付けない?

URLリンク(rararahp.cool.ne.jp)
ここのページによると原因はVC6だかららしい。
ついでに解決策を参考にして、何とかソート出来た!

378:デフォルトの名無しさん
05/12/14 14:06:07
>>376
ついでに補足しておく。
C++標準において、「std::list<>::sort()がStableソートであり、等価な要素の
相対的な位置関係が保たれること」が、保証されている。
で、歴史的な理由により、ほぼ全ての実装でマージソートが採用されている。
(が、その保証はない)

379:デフォルトの名無しさん
05/12/14 19:51:00
επιστημη ←こいつ調子に乗ってるな
何様だよ

380:デフォルトの名無しさん
05/12/14 19:55:23
こんなところで吠えてないで本人に直接言えよ

381:デフォルトの名無しさん
05/12/14 21:58:36
標準化メンバーの1人だっけ?

382:デフォルトの名無しさん
05/12/14 23:28:12
そだよ、標準ライブラリの一部も彼を含めた日本の標準化委員会の案

383:デフォルトの名無しさん
05/12/14 23:53:13
>>379
過疎スレにいってらっしゃい。

επιστημηってウザくね?
スレリンク(tech板)

384:デフォルトの名無しさん
05/12/15 23:21:33
ハーバート・シルトのSTL標準講座という本でSTLの勉強をしていたのですが
どうしてもわからないものにぶち当たってしましたました。
下記のソースのなかで
p = find_if(v.begin(), v.end(), iscomma);
とありますがこの中のiscommaが何も実引数を持たずに呼び出されています。
これってどういうことなのでしょうか?
もしお時間のある方いらっしゃいましたらご教授お願いいたします。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
// find()とfind_if()の用例
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
// chがカンマならtrueを返す
bool iscomma(char ch) {
if(ch==',') return true;
return false;
}
int main() {
vector<char> v;
vector<char>::iterator p;
char str[] = "One, Two, Three";
int i;
for(i=0; i<strlen(str); i++) v.push_back(str[i]);
p = find_if(v.begin(), v.end(), iscomma);
cout << "After find first comma: ";
while(p != v.end()) cout << *p++;
cout << endl;
return 0;
}

385:デフォルトの名無しさん
05/12/15 23:25:25
そこで呼び出されてるわけじゃない。
関数のアドレスを渡してるだけ。

386:デフォルトの名無しさん
05/12/15 23:26:58
>>384
そもそも呼び出されてすらないし。find_ifに関数渡してるだけでしょ。
find_ifの中の人がiteratorを実引数にしてiscommaを呼び出すってだけの話。

387:デフォルトの名無しさん
05/12/15 23:27:40
Oppsかぶったかぶった。

388:デフォルトの名無しさん
05/12/15 23:51:56
>>385-386
ものすごく納得いきました。ありがとうございます。


389:デフォルトの名無しさん
05/12/16 02:58:10
>>388 は qsort とか使ったことなかったのかな・・

390:デフォルトの名無しさん
05/12/16 06:00:51
皆が皆CからC++へ行くわけじゃないからね。

391:デフォルトの名無しさん
05/12/16 06:34:27
qsortはCの関数だがな

392:デフォルトの名無しさん
05/12/16 07:00:16
話がかみ合ってない悪寒

393:デフォルトの名無しさん
05/12/16 08:10:52
>>385
> 関数のアドレスを渡してるだけ。

関数オブジェクトを渡しています。


394:デフォルトの名無しさん
05/12/16 08:12:50
>>393
馬鹿ですか?関数と関数オブジェクトの見分け方ぐらい
付けられるようになっとけ。

395:デフォルトの名無しさん
05/12/16 11:09:08
>>387
オップス?
もしかして:Oops!

396:デフォルトの名無しさん
05/12/16 14:31:25
>>393の必死な言い訳

397:デフォルトの名無しさん
05/12/16 16:22:37
関数⊂関数オブジェクト

398:デフォルトの名無しさん
05/12/16 16:25:37
もう少しこう、うっかり騙されそうなネタで頼む

399:デフォルトの名無しさん
05/12/16 16:43:58
↓素直に自分の無能を認める>>393

400:デフォルトの名無しさん
05/12/16 17:07:28
俺が悪かった

401:デフォルトの名無しさん
05/12/16 17:12:16
いや俺のほうが悪い

402:デフォルトの名無しさん
05/12/16 17:51:26
私のために争わないで!

403:デフォルトの名無しさん
05/12/16 18:21:45
もうこれ以上

404:デフォルトの名無しさん
05/12/16 18:55:58
君のまわりに不幸の存在を俺は認めない

405:デフォルトの名無しさん
05/12/16 20:07:19
>>389
10月中旬ごろ標準Cの勉強を始めて
11月下旬に標準C++へ、MFCを使って電卓を作って、WinSockでechoサーバをみようみマネでつくり
昨日、初めてSTLの勉強を始めて・・・何故か本の真ん中からはじめたので右も左もわからず・・・・

って感じです。今までネットワークエンジニアとして修行していたのでプログラミングは、つぅあっパリですw

406:デフォルトの名無しさん
05/12/16 23:47:13
最初から読もうぜ。結構なんとかなってしまうけど、基本も大事だしね。

407:デフォルトの名無しさん
05/12/17 00:43:22
>>406
STLにも勉強する順番があるんですか?

408:デフォルトの名無しさん
05/12/17 00:55:26
>>407
私は>>406ではありませんが。勉強に順序はありません。でも、
一般的にはstd::vector<>が最初に紹介されていませんかね?

409:デフォルトの名無しさん
05/12/17 00:59:32
>>407
俺は>>406じゃないけど、STLを基本概念から全部理解しようと
したら大変だぜ。本が何冊も出ている。

よく使うコンテナやアルゴリズム、関数オブジェクトの使い方あたり
から少しずつ入って行けば楽なのではないかと思う。

410:デフォルトの名無しさん
05/12/17 01:22:06
vector → list → iterator → algorithm → functional → その他

くらいでいいんじゃね?

411:デフォルトの名無しさん
05/12/17 02:25:01
>>410
ご教授、ありがとうございます。
時間があればそのようなことをしたいと思います。

412:デフォルトの名無しさん
05/12/17 02:36:29
>>411
vector→list→map→algorithm→functional→[boost]

413:デフォルトの名無しさん
05/12/17 03:26:07
最初からLoki

414:デフォルトの名無しさん
05/12/17 03:48:00
>>412
はいはい。じゃーそれで

415:デフォルトの名無しさん
05/12/17 07:17:05
Vector → 窓の杜

416:デフォルトの名無しさん
05/12/17 09:35:09
Vector→Quaternion→Matrix

417:デフォルトの名無しさん
05/12/17 10:16:04
テンソルは?

418:デフォルトの名無しさん
05/12/17 10:41:51
>>414
わかればよろしい。

419:デフォルトの名無しさん
05/12/17 10:54:53
Scalar → Vector → Tensor

はいはい、テンソルテンソル。

420:デフォルトの名無しさん
05/12/17 11:04:45
>>419 わかればよろしい

421:デフォルトの名無しさん
05/12/17 11:08:09
>>419
わかればよろしい。

422:デフォルトの名無しさん
05/12/17 11:10:04
はいはい、すごいね、テンソルテンソル

423:デフォルトの名無しさん
05/12/17 12:19:52
>>410
> vector → list → iterator → algorithm → functional → その他
>>412
> vector→list→map→algorithm→functional→[boost]

俺は最初からiterator、algorithm、functionalを軽くやるスタイルが良いと思う。
ステファノフさんのオリジナルSTL本はこの流儀。

そういう意味ではvectorはC的な操作への誘惑が強く、
mapやsetが最初のコンテナとして適当ではないかと。

424:デフォルトの名無しさん
05/12/17 13:02:54
私は実務で使いながらだったから
vector → iterator → algorithm
の順に入ったな。
Cの経験が充分あるなら、取り敢えず可変長配列としてのvectorを見てから
それを一通り使い倒して他にいくと言う意味で悪くないと思う。
#例えばvectorのoperator[]に馴れてそこで留まる香具師にはどうせalgorithmなんて使いこなせないわけだし。

425:デフォルトの名無しさん
05/12/17 13:54:13
>>424
そえは業務でalgorithmを使っていないって事ですか?

426:デフォルトの名無しさん
05/12/17 14:02:05
ヘタレがvector使うとバグの温床になる
listとか使った方がまだまし

427:デフォルトの名無しさん
05/12/17 14:14:24
>>426
なんで?逆じゃないの?

428:デフォルトの名無しさん
05/12/17 14:23:39
vectorやstringは、今となっては設計が5年は古いよな。
algorithmを使えば済むものが、内部メソッドになってしまっている。

429:デフォルトの名無しさん
05/12/17 14:31:45
>428
stringはともかくvectorにそれ当てはまる?

430:デフォルトの名無しさん
05/12/17 15:18:02
>>428
あんた、実はあんまりSTLを知らないね。

std::algorithmを適用できないイテレータを持つコンテナに最適な
アルゴリズムを用意したのが、大抵の内部メソッドだ。

それから、std::stringは、STLには大抵入れない。random access iterator
を使えるので、適用できるアルゴリズムが多いのは確かだが、
用途が主に文字列の操作なので、Cのstring.hに対応する関数を
内部で持っただけ。

431:デフォルトの名無しさん
05/12/17 15:36:34
>>430
stringの後半の主張はどうかと思うぞ。
STL以前からあるクラスで、今やオールドタイプだ。

432:デフォルトの名無しさん
05/12/17 15:50:32
std::stringにバイナリを入れられるのは知ってるけど、果たして
std::stringの内部メソッドがそれに適したような格好になってるかな?

433:デフォルトの名無しさん
05/12/17 18:51:43
>>432
何がいいたいかよくわからん。

434:デフォルトの名無しさん
05/12/17 19:23:27
>>432
typedef basic_string<char> string; ですから、charなんなんでもありです。
ただしc_str()は'\0'が途中にあるとまずいですが。

>>430
SGIのSTLにstring入ってるぞ。

435:デフォルトの名無しさん
05/12/17 19:55:23
>>434
>ただしc_str()は'\0'が途中にあるとまずいですが。

まずくないよ。size()とともに用いればいいだけ。
下のコードでヌル100文字で埋められていることを確認汁。

string str;
str.resize(100);
fwrite(str.c_str(), sizeof(string::value_type), str.size(), fp);

436:デフォルトの名無しさん
05/12/17 20:02:02
>>435
まずくないのには同意だが、そういうとき普通はc_strじゃなくdataを使うだろ。

437:デフォルトの名無しさん
05/12/17 20:15:33
>>436
data()は今の議論のテーマではない。
終端に確実にヌルが付加されるc_str()を使わずdata()を用いる利点など一切ない。

438:デフォルトの名無しさん
05/12/17 20:18:49
>>437
fwriteに渡すのに終端文字がいちいち付加される意味ないのでc_str()なんか使う意味ないだろ

439:デフォルトの名無しさん
05/12/17 20:19:39
何故?

実装によっては、capacity() != size() の時、
c_str()はdata()より重い処理になるよ。

>>435のようにsize()と使うならdata()ってのが定石だと思う。

440:デフォルトの名無しさん
05/12/17 20:20:10
>>439は、>>437へのレス

441:デフォルトの名無しさん
05/12/17 20:26:47
>>438
仕様変更に対する事前策を用意しておくことを無意味とは、大胆発言だな。

ヌル終端文字列を前提とした既存のC関数に渡すとき、
バッファオーバランの可能性を軽減することができる。
この点においてstring::c_str()は、string::data()やstringstream::str()より安全性に優れている。

ヌル終端保証されたc_str()と保証されないdata()。
一方で、c_str()とdata()が同じ挙動をするSTLも存在する。
どちらを使うべきかは一目瞭然だろう。

442:デフォルトの名無しさん
05/12/17 20:28:22
>>439
サンプルとなる、ソースと開発環境を書け。

443:デフォルトの名無しさん
05/12/17 20:32:35
>>441
バイナリデータブロックを扱っているところをnul文字終端に仕様変更する準備をしておくなんて
普通じゃないな

444:デフォルトの名無しさん
05/12/17 20:35:43
>>443
Unicode文字列をバイナリデータとして扱っている場合などはそうでもない。
何をもって普通というのかその人の経験量だろうけど。

445:デフォルトの名無しさん
05/12/17 20:38:55
1.c_str()は'\0'が途中にあるとまずい
2.size()とともに用いればまずくない
3.そういうときはc_strじゃなくdataを使う
4.ヌル終端文字列を前提とした既存のC関数に渡すときc_str()のほうが安全
5.1に戻る


446:デフォルトの名無しさん
05/12/17 20:40:22
>>439の実証コードはまだですか?
>>439の正しさが確認されないことには、
議論が進まないのでなるべく早目にお願いします。

447:デフォルトの名無しさん
05/12/17 20:44:06
>>445
多分、3.は必要ないから、無限ループには陥らない。

448:デフォルトの名無しさん
05/12/17 20:55:04
結論としては、nul終端が必要ない時はdata()を使え。ただし義務ではない。


449:デフォルトの名無しさん
05/12/17 20:59:41
data()を使う合理性が確認できない。という限定された結論しか出ていない。
c_str()に対するdata()のパフォーマンス優位性も一切確認されていない。

全ては信者の脳内にしか存在しない。

450:デフォルトの名無しさん
05/12/17 21:07:02
逆にc_str()の方が安全である実装はあるのか?
俺の知っている実装は全て、data()とc_str()は同じものを返すよ。
data()の時も実は'\0'で終端されているという…

451:デフォルトの名無しさん
05/12/17 21:13:43
>>450
size() == 0の時少し振る舞いが違うぞ。
まあ多くの実装で返ってくるものは同じだが(w

452:デフォルトの名無しさん
05/12/17 21:14:32
c_str()のdata()に対する優位性
・ヌル終端保証
・"c_str"というキーワードが他であまり使われないので、文字列検索が"data"に比べて簡単

data()のc_str()に対する優位性
・不明

453:デフォルトの名無しさん
05/12/17 21:15:15
VC++7.1はdata()がc_str()を呼んで、c_str()が_Myptr()を呼んでるよ。

454:デフォルトの名無しさん
05/12/17 21:17:31
>>441
そこでstringstream::str()を引き合いに出してくる理由がわからない。


455:デフォルトの名無しさん
05/12/17 21:19:15
data()のc_str()に対する優位性
・ソース内にc_str()と混在させることにより難読性を高めて、他のプログラマがコピペしにくくする著作権保護効果。

456:デフォルトの名無しさん
05/12/17 21:23:13
>>454
己の経験不足を報告するスレじゃないはずだぞ。

457:デフォルトの名無しさん
05/12/17 21:32:22
stringstream::str()はstd::stringを返すのだからss.str().c_str()という手段はないのか?

458:デフォルトの名無しさん
05/12/17 21:33:10
>>452
> data()のc_str()に対する優位性

Cスタイルの文字列を必要としている局面でないことが明確。

459:デフォルトの名無しさん
05/12/17 21:44:24
問題があるのは、stringstream::str()じゃなくてstrstream::str()だった。スマソ。

460:デフォルトの名無しさん
05/12/18 00:07:21
STL使うとどうなるの?

461:デフォルトの名無しさん
05/12/18 00:12:32
>>460
一気に実行ファイルサイズが10倍になります。

462:デフォルトの名無しさん
05/12/18 00:14:24
>>460
別世界が開ける。

463:デフォルトの名無しさん
05/12/18 00:48:02
>>461
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

464:デフォルトの名無しさん
05/12/18 00:57:46
>>461,463
はいはい、他スレのテンプレわろすわろす

465:デフォルトの名無しさん
05/12/18 00:57:49
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

466:デフォルトの名無しさん
05/12/18 01:03:05
懐かしいなw

467:not 463
05/12/18 01:03:25
そりゃそうでしょ。
「実行ファイルのサイズが10倍になる」を受けてるレスだから。

468:デフォルトの名無しさん
05/12/18 01:12:09
URLリンク(www.google.com)

469:デフォルトの名無しさん
05/12/18 01:30:19
>>468
ワロスwwwww

470:デフォルトの名無しさん
05/12/18 01:36:26
懐かしさと共にワロスwwww

471:デフォルトの名無しさん
05/12/18 01:45:39
自作自演乙

472:デフォルトの名無しさん
05/12/18 02:03:26
>>471 がどれを自作自演と言いたいのか判らない。

473:デフォルトの名無しさん
05/12/18 05:32:51
だってこのスレに書き込んでるの俺一人しかいないしw

474:デフォルトの名無しさん
05/12/18 07:27:07
いつも思うのだが、>>463は正しいことを書いてる。
あの時点で注目されているのはテンプレートのコード生成に伴うサイズ増量であって、
Cランタイムがどのようにリンクされようがテンプレートと何の関係もない。
むしろ動的リンクの方がテンプレートによる増量がわかりやすいかもしれない。

475:デフォルトの名無しさん
05/12/18 07:31:10
           i::::::::/'" ̄ ̄ヾi
           |:::::::| ,,,,,_  ,,,,,,|
           |r-==( 。);( 。)
           ( ヽ  :::__)..:: }
        ,____/ヽ  ー== ;  ほほう それでそれで?
     r'"ヽ   t、   \___ !
    / 、、i    ヽ__,,/
    / ヽノ  j ,   j |ヽ 
    |⌒`'、__ / /   /r  |
    {     ̄''ー-、,,_,ヘ^ |
    ゝ-,,,_____)--、j
    /  \__       /
    |      "'ー‐‐---''

476:デフォルトの名無しさん
05/12/18 07:48:26
std::string使ってないなあ
MBSやsurrogateやらの対応が甘そうだったので自前で作った

477:デフォルトの名無しさん
05/12/18 08:06:26
std::stringから継承するという選択肢は無視かね。
MBS対応メソッドを追加すればすむだけなのに。

478:デフォルトの名無しさん
05/12/18 09:40:48
std::stringから派生するのはやめた方が……。
非仮想デストラクタだし、スライスも怖いし……。

479:デフォルトの名無しさん
05/12/18 10:03:16
>>478
非仮想デストラクタの心配は杞憂。

別のスコープで作られた派生クラスインスタンスを
基底クラスのポインタで破棄すべき状況が、
果たして文字列クラスで起こりうるかどうか考えよう。
ポインタを使いたくないからクラス化しているのに本末転倒な状況だ。

また、STLのコンテナやアルゴリズムがテンプレートを用いており、
継承をあえて使っていない理由についても考えよう。


ところで、「スライス」とは何?

480:デフォルトの名無しさん
05/12/18 11:36:17
>>479
基底クラスへのスライシングだろ。
非仮想デストラクタの場合と心配してるところの根は同じだと思う。


481:デフォルトの名無しさん
05/12/18 11:40:33
>>479
> ポインタを使いたくないからクラス化しているのに本末転倒な状況だ。

そんなあほな。

482:デフォルトの名無しさん
05/12/18 11:58:05
>>480
スライスが動詞でスライシングが動名詞だということだけはわかりました。本当にありがとうございました。

>>481
そういうもんですか?
自分でバッファを確保・解放するなら、
文字列クラスじゃなくて生のchar*でいい気がするけど、どうでしょうか。
暗黙のうちに解放されるコンテナの場合、>>479が触れているとおりテンプレートだし。
だめ?

483:デフォルトの名無しさん
05/12/18 12:40:10
スライシングすらわからんのなら出直してこい


484:デフォルトの名無しさん
05/12/18 12:46:34
>>476
std::wstringは?

>>477
char_traitsの自作は?

485:デフォルトの名無しさん
05/12/18 14:40:45
オススメはbasic_string<unsigned char>でUTF-8

いや、マジで。


486:デフォルトの名無しさん
05/12/18 14:55:54
1文字進めるとかは?

487:デフォルトの名無しさん
05/12/18 15:01:58
>>484
>std::wstringは?
ワイド文字列の罠
URLリンク(hw001.gate01.com)

488:デフォルトの名無しさん
05/12/18 15:34:13
Windows上で多言語対応が必要ないなら16bit化SJISをwstringにつっこむのが最強。

489:デフォルトの名無しさん
05/12/18 18:40:23
>>488
それAPIやライブラリ関数呼び出しの度にchar*またはwchar_t*に
変換せなあかんのか
最悪じゃん

490:デフォルトの名無しさん
05/12/18 19:28:16
>>488
UTF-16をwstringに格納することに比べどんな利点があるのか?

491:デフォルトの名無しさん
05/12/18 21:56:36
1文字進めるのが簡単

492:デフォルトの名無しさん
05/12/18 22:04:08
そして2文字戻す。

493:デフォルトの名無しさん
05/12/18 22:51:03
三歩進んで二歩下がる

494:デフォルトの名無しさん
05/12/19 09:49:59
>>479
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、
> 継承をあえて使っていない理由についても考えよう。

(゚Д゚)ハァ?
テンプレート関係ないやん

495:デフォルトの名無しさん
05/12/19 10:12:46
>>479
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、
> 継承をあえて使っていない理由についても考えよう。

(゚Д゚)ハァ?
テンプレート関係ないやん

496:デフォルトの名無しさん
05/12/19 11:18:52
>>479
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、
> 継承をあえて使っていない理由についても考えよう。

(゚Д゚)ハァ?
テンプレート関係ないやん

497:デフォルトの名無しさん
05/12/20 21:18:46
>>479
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、
> 継承をあえて使っていない理由についても考えよう。

(゚Д゚)ハァ?
テンプレート関係ないやん

498:デフォルトの名無しさん
05/12/20 21:37:00
>>479
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、
> 継承をあえて使っていない理由についても考えよう。

(゚Д゚)ハァ?
テンプレート関係ないやん

499:デフォルトの名無しさん
05/12/20 22:42:51
>>479 
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、 
> 継承をあえて使っていない理由についても考えよう。 

(゚Д゚)ハァ? 
テンプレート関係ないやん 

500:デフォルトの名無しさん
05/12/20 23:23:51
よくわからん流れだが
500は頂いとくよ

501:デフォルトの名無しさん
05/12/20 23:26:28
ショック!自作ゲームでわざわざタスクシステムを自前リストで作ってたけど、
STL使ったら直ぐに出来上がった。
今まで食わず嫌いしてて損したよママン。

502:デフォルトの名無しさん
05/12/20 23:47:06
まあまあ、苦労は一回はいいんでないかい。一回だけね。

503:デフォルトの名無しさん
05/12/20 23:59:43
ゲームのタスクシステムに向いてるのってsetとlistどっちでしょうか?

504:デフォルトの名無しさん
05/12/21 00:08:58
普通は組み合わせることになるんじゃないの?

mapのlistとか、vectorのmapとか。
setはあんまり出番なさそうだけど。

505:デフォルトの名無しさん
05/12/21 00:10:53
priority_queueだと思うが。

506:501
05/12/21 00:16:04
俺はlistで作ってみた。で、タスクは一定のメモリを使い回すのが利点なので、動的メモリ確保開放しないように作りたい。
で、結局push_frontでダミーを一定量確保したら一旦clearするようにタスクのファクトリを作ってみた。

push_back等で一定量確保した後で、eraseやclearを使った後は、前に確保した領域は使い回されている保障はあるのかな。
誰か詳細キボン。

507:デフォルトの名無しさん
05/12/21 00:18:58
そういう場合のためにアロケータがあるんだけどな。

508:501
05/12/21 00:21:48
>>507
なるほど偉い便利だな。これで心置きなく作れる。
サンクス。

509:デフォルトの名無しさん
05/12/21 00:31:08
>506
そういうのはvectorだけじゃね?
reserve()があるのはvectorだけだし。

510:デフォルトの名無しさん
05/12/21 01:18:42
するとvectorのarg2に自前のアロケータテンプレート指定して作れって事ですかね。
安心できると思ったけど結構めんどいね。

511:デフォルトの名無しさん
05/12/21 01:34:11
>510
reserve()はアロケータの呼び出し自体を抑えて、動的メモリの再確保回数を減らす方法。
listで似たような事をしたければ自前アロケータの内部で似たようなことをするように作れ、と言うこと。

512:デフォルトの名無しさん
05/12/21 04:40:22
boost::poolをコンテナの第三引数に入れて、ベンチマークを取ったり
した。ケースバイケースだけど、こちらの方がわずかに速くなる場合がある。

逆に遅くなる事もある。環境や用途にも大きく左右されると思うので、
各自実験してみて欲しいが、なかなか面白いる

513:デフォルトの名無しさん
05/12/21 05:02:50
>面白いる
いらん

514:デフォルトの名無しさん
05/12/21 05:11:03
かなタイプで、「。」を「る」に打ち間違えただけじゃないかー
そんなに責めるなよーorz

515:デフォルトの名無しさん
05/12/21 07:04:20
>>510
作らないでもいろいろある。

516:デフォルトの名無しさん
05/12/21 13:55:28
>>515
それを聞きたいいる

517:デフォルトの名無しさん
05/12/21 15:08:20
STLを学ぼうとして最初に思い込みが原因か疑問符がついたので質問させてください。
string型なのですが、char型配列→string型はもちろんできます。
逆も「読み取り専用」なら str.c_str(); で出来たのですが、string型に直接値を入れるのはできないのでしょうか。(設計思想的にできないのかなと思ってます)

例えば
strcpy(str.hoge(), "こんにちは");
なんて真似です。
作ってるアプリケーションでGetOpenFileNameを使っているのですが、
一旦char配列にファイルパスを受け取らせ、その後pathを保存しておくためのstring型に変換するべきなのでしょうか。

518:デフォルトの名無しさん
05/12/21 16:37:52
よくわからないけど、
std::string hoge;
hoge = "こんにちは"
ならできるよ?

519:デフォルトの名無しさん
05/12/21 16:44:07
お返事ありがとうございます。

それは = 代入演算子が使われているからですよね。
それではなく
sprintf(str.c_str(), "%d", 5);
などが出来ないかなと思いまして。

↑これ自体はやっちゃいけないらしいですけど、他でこの想定にかなう方法はあるのかなと。
Win32APIなどでは、char*を引数で渡して中身を入れてもらうAPIも多くあるので…。

520:デフォルトの名無しさん
05/12/21 16:48:31
要はstrcpy()とかsprintf()とかfgets()のような振る舞いをする関数で使いたいと言うことだろ。
ポインタを渡してそこに書いてくれるような。


521:520
05/12/21 16:49:51
がーん、リロードすべきだったw

で、WinAPIを使いたいだけならCStringという妥協でも委員でないの?

522:デフォルトの名無しさん
05/12/21 17:41:27
STLのstringはそういう扱いはできないということですね。
ありがとうございました。

523:デフォルトの名無しさん
05/12/21 18:08:18
stdio系使わずにstringstream使え

524:デフォルトの名無しさん
05/12/21 18:42:47
sprintf -> stringstream
fgets -> getline

とか、代替のものがあるので、それを使うのが一番じゃないかな。

525:デフォルトの名無しさん
05/12/21 18:59:21
>523>524
WinAPIで使いたい、って書いてあるやん。

526:デフォルトの名無しさん
05/12/21 20:03:24
std::string strprintf(const char *fmt, ...)
みたいな関数をでっち上げればいい。

527:デフォルトの名無しさん
05/12/21 20:27:50
んなことやるぐらいならboost::formatで。

528:デフォルトの名無しさん
05/12/21 20:29:26
boostは使いたくない

529:デフォルトの名無しさん
05/12/21 21:17:49
>>528 その心は?

530:デフォルトの名無しさん
05/12/21 21:21:00
>>519
WinAPI相手ならstd::vector<TCHAR>で我慢してくれ。

531:デフォルトの名無しさん
05/12/21 21:46:12
>>529サイズがでかくなるから

532:デフォルトの名無しさん
05/12/21 21:50:43
環境によるだろ。
俺は(略)

533:デフォルトの名無しさん
05/12/21 21:57:57
すげえ。ダイナm(略)

534:デフォルトの名無しさん
05/12/21 23:27:46
#include <stdafx.h>

後(略)

535:デフォルトの名無しさん
05/12/21 23:34:43
>>517
望みは捨てるな。
スレリンク(tech板:469-470番)n

469デフォルトの名無しさん2005/12/21(水) 06:05:51
URLリンク(www.open-std.org)
News 2005-12-19: The 2005-12 mailing is available (1600 kb tar.gz, .zip 1600 kb) individual papers
News 2005-12-17: The C++ Standard Library Issues List (Revision 40) is available (.tar.gz)
News 2005-12-17: C++ Standard Core Language Issues List (Revision 39) is available, also committee version

470デフォルトの名無しさんsage2005/12/21(水) 10:29:39
うげっ、std::string<>もメモリ上の連続性を仮定するようになるのかよ。

536:http://pc8.2ch.net/test/read.cgi/tech/1133007604/470
05/12/22 02:30:13
>>535
恥ずかしいから貼らないでくれorz

537:デフォルトの名無しさん
05/12/22 02:39:38
std::string hage="ビャーネ";
hage[0] = 'ウ';

いまでもこれならできたりする。

538:デフォルトの名無しさん
05/12/22 02:53:20
うむふ

539:デフォルトの名無しさん
05/12/22 10:17:18
>>535
いやっほーう!

540:デフォルトの名無しさん
05/12/22 10:35:35
>>535
> 530. Must elements of a string be contiguous?
> (中略)
> The characters in a string are stored contiguously, meaning that if
> s is a basic_string<charT, Allocator>, then
> it obeys the identity
> &*(s.begin() + n) == &*s.begin() + n
> for all 0 <= n < s.size().

か。

541:デフォルトの名無しさん
05/12/23 00:19:34
URLリンク(tricklib.com)

std::string location;
sprintf(capture_string(&location), "<%s>#%d", __FILE__, __LINE__);

542:デフォルトの名無しさん
05/12/23 05:38:16
>>541 突然なんだ?

543:デフォルトの名無しさん
05/12/23 14:25:28
>>542

ちょっとタイミング外したけど、>>519 に対してのレス。

544:デフォルトの名無しさん
05/12/23 18:14:09
dequeがサイズ拡大時に確保するメモリブロックのサイズって大体どれくらいなのでしょうか?

545:デフォルトの名無しさん
05/12/23 18:17:10
処理系による。

546:デフォルトの名無しさん
05/12/25 01:50:59
STLportっていつの間にURL変わったんだ?
ver5.0 出てるなんて知らなかった(////)

547:デフォルトの名無しさん
05/12/25 16:14:29
setとmultisetってどういう風に使い分ければいいんでしょうか?

548:デフォルトの名無しさん
05/12/25 16:15:32
>>547
使えばすぐにわかる。

549:デフォルトの名無しさん
05/12/25 22:00:03
setは集合。つまり重複要素を許さない。
multisetってのは集合ではなく、重複要素を許す。


550:デフォルトの名無しさん
05/12/26 11:31:17
>>549
普通「集合」は重複を許すと思うが。
すくなくとも数学ではそうだ。

551:デフォルトの名無しさん
05/12/26 12:02:11
>>550
よくわからん。
数学では
{1} = {1,1}
じゃないか?

552:デフォルトの名無しさん
05/12/26 12:04:06
数学では普通両者を区別するよ
高校数学までではこんなこと気にしないと思うけどね

553:デフォルトの名無しさん
05/12/26 12:06:13
数学だと重複してるものがいくつあっても同じと考えるから、
実質的に重複を許さないのと同じ

Wikipedia項目リンク
>集合は、順番を入れ替えたり、同じものを付け加えても、もとのものと等しい:
>  {1,2,5,7,10} = {5,1,7,2,1,5,10,2}.

554:デフォルトの名無しさん
05/12/26 12:10:04
ZFは普通じゃないのか。
外延性公理
∀a∀b[a=b⇔∀x(x∈a⇔x∈b)]

555:デフォルトの名無しさん
05/12/26 14:15:30
質問です。
二次元dequeを作ろうと思っているのですが

deque<deque<int> > list;
として
list.push_back(deque<int>());

とすると、deque<int>のデストラクタが2回呼ばれてしまう気がします。
これはやって大丈夫なのでしょうか。

また、
deque<CHoge> > list;
list.push_back(CHoge());
でも同様にCHogeのデストラクタが二回呼ばれてしまい問題が出てしまいました。

dequeはクラスなどの「実体の配列」ではなく、「クラスのポインタの配列」にするべきなのでしょうか。
ですがそうするといちいちpop_backなどをする前にdeleteでデストラクタを呼んでやらなければならなくなり、結構面倒です。
使い方が根本的に間違っているのでしょうか?
実体のdequeがつくれ、pushやpopでコンストラクタやデストラクタが1度ずつ呼ばれてくれるのを期待しているのですが…。

556:555
05/12/26 14:16:32
補足です。
>list.push_back(deque<int>());

>とすると、deque<int>のデストラクタが2回呼ばれてしまう気がします。
引数で作られた無名なくラスのデストラクタと、
アプリケーションの最後でlistが解放される際のデストラクタで計2回ということです。



557:デフォルトの名無しさん
05/12/26 14:19:42
>>556
コンストラクタが二回、デストラクタが二回走るだけで、
問題はない。

>deque<CHoge> > list;
>list.push_back(CHoge());

これも、CHogeのデフォルトコンストラクタ・コピーコンストラクタ・デストラクタが正しく定義されていれば
問題ないはず。

558:デフォルトの名無しさん
05/12/26 14:25:53
>>557
ありがとうございます。
なるほど。

しかしCHogeはポインタをメンバー変数として所持し、デストラクタでdeleteするようにつくられています。
auto_ptrを使うとよさそうですが、そうするとアップキャストできなくなるのが(CHoge内ポインタの役割上)問題です。

自前で参照カウントを作るか、素直にポインターで実装するべきでしょうか。
deque<CHoge*>
insertやpop, pushするたびに自前でdeleteすることになりますが…。
アドバイスいただければ幸いです。

ところでSTLには、実体を伸び縮みさせられるコンテナはないのでしょうか?
dequeはどうも実体を伸び縮みさせるのには向かないような…。

559:デフォルトの名無しさん
05/12/26 14:32:02
vector< vector<char> > を使って、
可変長構造体にキャストして使うことは可能。

ただ、実体自体を伸び縮みさせるのではなく、
そういうのをポインタで保持するのが普通だと思う。

560:デフォルトの名無しさん
05/12/26 14:35:06
なるほど。
vectorで実体を必要な分確保しておいて、それをdequeにあてはめるわけですね。
しかしvectorは配列が2の乗数を超えるように増えた場合に配列を作り直しますから、コンストラクタとデストラクタがふいなことで呼び出されてしまいそうです。

素直にポインタでやってみようと思います。
ありがとうございました。

しかし>>558でinsertやpop, pushするたびに〜って書いてありますが
どう考えてもpopの時しかdeleteは呼びませんね。お恥ずかしい。

561:デフォルトの名無しさん
05/12/26 17:25:44
ポインタのコンテナで自前deleteがいやなら、スマートポインタのコンテナにすればいいじゃない。

ポインタをメンバー持ってるなら、ちゃんとコピー操作に手をいれておけよ。
禁止だけなら3行で済むし。

562:デフォルトの名無しさん
05/12/26 18:05:09
auto_ptrはコンテナの要素にすることが禁止されていなかったか?

563:デフォルトの名無しさん
05/12/26 18:06:51
STLport を使っているんですが、
string にバインドできる stream ってないでしょうか?

std::string str, day_status("善い日");
std::ostrstreambuf out(str);
out << "今日は" << day_status << "だ、便が出る";
std::cout << str << std::endl;
-- outpu --
今日は善い日だ、便が出る

こんなヤツ

564:デフォルトの名無しさん
05/12/26 18:08:16
>>562
boost::shared_ptr

565:デフォルトの名無しさん
05/12/26 18:09:43
>>563
stringstream


566:565
05/12/26 18:10:18
と、ちょっと用途が違うみたい。スマン忘れて

567:デフォルトの名無しさん
05/12/26 18:11:09
>>563
バインドはできないけど、std::ostringstreamからstr()でstd::stringを取り出せる。

568:デフォルトの名無しさん
05/12/26 18:20:12
>>564
うお、shared_ptrだったら大丈夫なのか。正直知らんかった。

コンテナが縮む時に、破棄された分の要素についてデストラクタが呼ばれるのって仕様上確定しているのかね?
確定していないからauto_ptr(とかshared_ptr)はダメなんだと思っていたんだが。

569:デフォルトの名無しさん
05/12/26 18:27:39
>コンテナが縮む時に、破棄された分の要素についてデストラクタが呼ばれるのって仕様上確定しているのかね?
当り前だ。それが保証されてなかったらそもそもコンテナがまともにつかえない。

auto_ptrがコンテナに入れられないのはコピーセマンティクスが破壊的だから。

570:デフォルトの名無しさん
05/12/26 18:29:38
>>565, >>567
ありがとうございます。
バインドできないのかー。
残念。

571:デフォルトの名無しさん
05/12/26 19:03:09
boostならpointer_containerもありますよっと。

572:デフォルトの名無しさん
05/12/26 23:54:01
vectorがA構造体の配列で
Aはメンバにid,dateを持っていて
例えばidが2を持つ一番初めの要素を検索するにはどのようにコーディングしたらよろしいのでしょうか

ご教授お願いします

573:デフォルトの名無しさん
05/12/27 00:03:34
>>572
自分ならこんな感じかな?

struct A_eq_id:std::binary_function<A,int,bool>{
    bool operator()(const A&a,int n)const{return a.id == n;}
};

std::vector<A> vect;

std::vector<A>::iterator itr = find_if(vect.begin(),vect.end(),bind2nd(A_eq_id(),2));


574:デフォルトの名無しさん
05/12/27 00:07:23
#include <algorithm>

struct A_id_is_2 {
 bool operator()(const A& a) {
  return a.id == 2;
 }
};

std::find_if(a_vector.begin(), a_vector.end(), A_id_is_2());

おもいっきし簡略化して書くとこんな感じか。
std::find_ifで調べてみるとよろし。

575:デフォルトの名無しさん
05/12/27 00:14:00
struct A {
bool operator(int key) const {return id == key;}
int id;
T date;
};

std::vector<A> foo;
std::find(foo.begin(), foo.end(), 2);

576:デフォルトの名無しさん
05/12/27 00:32:06
a_vector.begin() + rand() % a_vector.size(); // ←多分これが2

577:デフォルトの名無しさん
05/12/27 00:40:10
boost様の登場

#include<boost/lambda/lambda.hpp>
#include<boost/lambda/bind.hpp>
using namespace boost::lambda;
std::find_if(vect.begin(),vect.end(),bind(&A::get_id,_1)==2);


578:577
05/12/27 00:42:25
あ、getterの定義いらね
std::vector<A>::iterator itr = std::find_if(vect.begin(),vect.end(),bind(&A::id,_1)==2);


579:572
05/12/28 01:18:49
とりあえず573で出来ました
これは前に書いた出力のやつに似ているので自分にあっているっぽいです

boostも便利らしいですが色々ややこしく…な感じです
STLも殆ど分かっていないですし手をつけるのもどうかなと思うところもあります

(しかしどうしてこのような結果が得られるのか今ひとつ分からん
も少し格闘してきます

580:デフォルトの名無しさん
05/12/28 10:40:22
>>579
>575と>574が理解できれば>573はその中間と言うか、汎用型じゃん。

581:デフォルトの名無しさん
05/12/28 11:38:41
>>580
ハイハイ。知ったか君。

582:575=580
05/12/28 11:53:17
>>581
何か?
#今改めて>575を見たらoperator==になってない……_/ ̄|○

583:デフォルトの名無しさん
05/12/28 22:14:09
vector<char>からcharの配列を取り出すのはわかるのですが(&vector.front())、
list<char>からの取り出し方法が分かりません。
リスト構造なのでループで回さないと無理なのかとも思うのですが、良い方法が
あればご教授お願いします。

584:デフォルトの名無しさん
05/12/28 22:17:05
>>583
empty() の時は front() 呼び出しちゃだめだから気をつけて。
vector 以外のコンテナからC言語の組み込み配列を得るには
コピーして作るしかない。

585:デフォルトの名無しさん
05/12/28 23:05:23
>>583
ループを回す代わりにイテレータで。
std::list<char> ls;
// ……。
std::vector<char> v(ls.begin(), ls.end());
場合によってはstd::stringのほうが良いかもしれない。

586:デフォルトの名無しさん
05/12/28 23:53:40
えっと Windows で STLPort 4.6.2 を使っているんだけど、StlPort って
スレッドセーフってことでいいのでしょうか?

マルチスレッドなプログラム書いてて、再現が難しい(リリースモードのみ)
バグがあって原因を追究しているんだけど、スタックトレースを
とったら、stlport の _alloc.c で落ちたみたいなんですが・・・

587:デフォルトの名無しさん
05/12/29 00:01:47
メモリリークの類がalloc.cで落ちるのはよくある話。

588:デフォルトの名無しさん
05/12/29 00:32:40
>>584-585
ありがとうございました。

589:デフォルトの名無しさん
05/12/31 16:33:11
簡単で標準的なスマポを標準テンプレートライブラりーで
教えてくださいって、既にテンプレートを貼ってあったら
ごめんなさい。

ちなみに、紅白の大鳥はスマップです。←見ねーよ
戦後60年を見るね。0:00英霊たちに合唱・・・亞ボーン

590:デフォルトの名無しさん
05/12/31 16:37:40
…(;゚Д゚)

591:デフォルトの名無しさん
05/12/31 17:38:49
>>589 斬新だな。

592:デフォルトの名無しさん
05/12/31 18:29:36
某より引用 左辺値を減らしてから代入する気が
tPtr->inc(); tPtr = ptr; tPtr->dec();
次に示す簡単なサンプルは,スマートポインタークラスのテンプレート
MemMgrと呼ばれるサポートクラスから作成されます。
SP クラスは,とても基本的で,-> や = といった演算子を唯一,
オーバーライドしたものです。
SP メンバー関数は,カウントの使用方法を保つため,
MemMgr inc()と dec()を呼び出します。
#include <iostream.h>
//--------------- class SP
template <class T>
class SP {
T* tPtr;
public:
SP(T* ptr) : tPtr(ptr) { tPtr->inc(); }
~SP() { tPtr->dec(); }
T* operator->() { return tPtr; }
SP& operator=(T* ptr) {
tPtr->inc();tPtr = ptr;tPtr->dec();
return *this; }
};
//----------- class MemMgr
class MemMgr {
int inUse;
public:
MemMgr(void) { inUse = 0; }
void inc(void) {++inUse;}
void dec(void) {if (--inUse == 0)elete this;}
};



次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4269日前に更新/228 KB
担当:undef