【C++】STL(Standard ..
175:デフォルトの名無しさん
05/11/13 23:27:54
>>173
#include <string>
void f(std::string& s) { s.reserve(1); }
これがエラーになるのか?
手元の gcc 3.4.4 @cygwin では普通にコンパイルできたよ。
176:デフォルトの名無しさん
05/11/13 23:41:07
いつになったら>>173の大馬鹿が露見することやらw
177:デフォルトの名無しさん
05/11/13 23:42:47
>>176
お前ヘッダファイルって、もしかして読んだこと無いのか?w
178:デフォルトの名無しさん
05/11/13 23:43:26
×>>176
○>>173
>>173
どのヘッダー読んだんだ?w
179:デフォルトの名無しさん
05/11/13 23:44:51
<string.h>か<cstring>じゃまいか
180:デフォルトの名無しさん
05/11/13 23:46:57
>>179
それだと「GCCの場合、 basic_string は実装されていない。」ってなるだろ。
181:デフォルトの名無しさん
05/11/13 23:47:09
もっと根本的な問題でマジでreverseを検索したに1票w
~~~~~
182:デフォルトの名無しさん
05/11/13 23:47:18
良くワカランが、昔のgccを見たのかもね
なんにせよボケだが
183:デフォルトの名無しさん
05/11/13 23:47:41
>> 172
Stroustrup の C++ 本にはそんな感じの図(S式っぽいの)がのってたんで、
そんな感じだと思い込んでたが、違ったのね Σ(゚д゚lll)ガーン
184:デフォルトの名無しさん
05/11/14 00:05:28
reserve()がビルド通っただけでご満悦の>>175も問題だぞ。
誰か>>175にかまってやれよ。
185:175
05/11/14 00:10:10
いや、おかまいなく。
186:デフォルトの名無しさん
05/11/14 00:18:20
実運用上、ほとんどのケースで便利なのはGCCの仕様。
むしろVCのreserve()は、reserve()を呼び出さなければパフォーマンスが低下するので、
必要に迫られてreserve()を使う場合が多い。
いちいちreserve()呼び出ししなくてもそれなりのパフォーマンスを出すGCCの方が扱いが楽。
それはちょうど、FILEの入出力でいちいちフラッシュする手間が必要か否かに似ている。
明示的にフラッシュする必要がない方が楽なのは言うまでもない。
187:デフォルトの名無しさん
05/11/14 00:55:45
>>186
GCC と VC の reserve の仕様ってどう違うんですか?
188:デフォルトの名無しさん
05/11/14 01:04:30
reserveの仕様じゃなくてバッファ確保の仕様が違うんだろ?
189:デフォルトの名無しさん
05/11/14 01:10:02
>>187,188
reserve()に大きな数字を指定したのち、capacity()の戻り値を調べる。
さあ試せ。そして報告しろ。
190:デフォルトの名無しさん
05/11/14 02:40:41
結論:GCC最強
VCは糞
191:デフォルトの名無しさん
05/11/14 03:39:45
>>190
何が最強なのか言ってみ
192:デフォルトの名無しさん
05/11/14 03:45:27
・VCは以下の項目で最強です
シェア
ANSI準拠度
サポート
ヘルプ
ライブラリ
最適化
開発環境の使いやすさ
開発環境が求めるスペック
クライアントの盲信度
ゲイツ度
193:デフォルトの名無しさん
05/11/14 03:46:28
listの要素を追加するとき、push_back関数で一つずつ追加するのが
面倒なんだけど、これを一挙にやる方法は標準で装備されてないのかな?
例えば、
list<int> a;
a.push_back(34);
a.push_back(77);
a.push_back(25);
ってことをする代わりに、
a.add(34, 77, 25)
あるいは
a.add(3, 34, 77, 25)
みたいなことができればうれしいんだが。
ちょっと調べた感じでは無いみたいなんだけどな。
もし無いとしたら、これってちょっと面倒くさくない?
194:デフォルトの名無しさん
05/11/14 04:03:04
便利になる場面が思いつかない
195:デフォルトの名無しさん
05/11/14 04:10:50
list<int>& operator << (list<int>& a, int b) { a.push_back(b); return a; }
list<int>& operator , (list<int>& a, int b) { a.push_back(b); return a; }
list<int> lis;
lis << 1, 2, 3, 4, 5;
196:デフォルトの名無しさん
05/11/14 04:27:04
>>193
そんなに面倒だと思うなら自分で勝手に実装しろよ。
って書こうとしたら既に>195まで書かれていた罠。
197:デフォルトの名無しさん
05/11/14 04:33:03
自分で実装するんならBoost.Assignでも使った方が良さげ
198:デフォルトの名無しさん
05/11/14 04:35:44
そういや禿って不自然な演算子は書くな(widget += buttonみたいな)って行ってるのに
何で<<←こんな変なもん作ったんだ?
199:デフォルトの名無しさん
05/11/14 04:37:43
>>195
サンクス。非常に参考になりました。
200:デフォルトの名無しさん
05/11/14 04:39:40
operatorで変な定義しとくと後で困るのにwww
201:デフォルトの名無しさん
05/11/14 04:54:57
>>195
これって1,2,3,4,5の順に代入されるのって保証される?
202:デフォルトの名無しさん
05/11/14 05:16:26
yes
C++本3rd 6.2.2:
,(コンマ)、&&(論理積)、||(論理和)演算子では、左側の被演算子の方が右側の被
演算子よりも先に評価されることが保証されている。
だってさ
203:デフォルトの名無しさん
05/11/14 05:20:57
というか普通の2項演算子(左結合)と同じってだけか
204:デフォルトの名無しさん
05/11/14 05:22:59
operator<<は許せるとして
「,」にそんな定義したらまずいだろw
関数の引数にするときとかどうなるんだよw
205:デフォルトの名無しさん
05/11/14 07:31:47
>>204
func(lis, 1, 2) ← funcを3引数でcall
func((lis, 1, 2)) ← lis, 1, 2を実行の後、funcを1引数でcall
206:デフォルトの名無しさん
05/11/14 19:17:50
>push_back関数で一つずつ追加するのが
>面倒なんだけど、これを一挙にやる方法は標準で装備されてないのかな?
普通は、こんな漢字でない。?
strstreamでも同じでない。
std::ifstream in_file("sample_students.txt");
while (read(in_file, record)) // read and store all the records
{students.push_back(record);}
詳細は、acceleratedC++のソースを
207:デフォルトの名無しさん
05/11/14 19:32:17
>>202
それは組み込みの演算子だけの事情だし、評価順序と結合規則は別の概念だからここでは関係ない。
>>203で正解
208:デフォルトの名無しさん
05/11/14 19:56:09
>>193
Boostが嫌なら配列を使って何とかするというのもなくはない。
int Initializer[] = {34, 77, 25};
std::list<int> a(Initializer, Initializer + sizeof Initializer / sizeof Initializer[0]);
>>198
見た目からしていかにも流し込むという感じがして、なおかつ
元々の<<(シフト)の意味だってCで作られたものであり、数学的な歴史を持ったものでないから、
人々も比較的思い入れがなく馴染みやすいだろうということでこれにした、
というようなことがD&Eに書いてあったはず。
今手元になくて、大まかにしか思い出せないけど。
209:デフォルトの名無しさん
05/11/14 21:32:06
最初は < と > にしようと思ったけど、人々の頭には既に
「より小さい」「より大きい」という意味が強く刷り込まれていたので
シフト演算子にした、というのは、C++3rdのほうの氏の表現。
まぁ同じことを言っているのだと見ていいだろうね。
210:デフォルトの名無しさん
05/11/14 21:35:36
>>209
そう言われればそんなこともD&Eに書いてあったな。
211:デフォルトの名無しさん
05/11/15 20:05:54
<<= 演算子じゃいけなかったのかな?
212:デフォルトの名無しさん
05/11/15 20:07:18
あ、よく考えたら、<< と、<<= だと優先順位などの関係で
まとめてかけなくなるからダメか。
213:デフォルトの名無しさん
05/11/15 20:37:00
どっちにしてもキモくてなじめないなw
214:デフォルトの名無しさん
05/11/15 20:59:09
extern int operator BjaneStroustrup(int x,int y);
...
printf("output = %d",1 BjaneStroustrup 2);
...
output = 禿禿禿
215:デフォルトの名無しさん
05/11/15 21:04:36
ここ死んでるね。
216:デフォルトの名無しさん
05/11/15 21:06:02
>>214
コンパイルエラー
217:デフォルトの名無しさん
05/11/15 21:16:16
>>211
それだと入力が>>=になって見た目の対称が取れない。
218:デフォルトの名無しさん
05/11/15 21:29:49
MFC使いっす。
すっとばしてたSTLのことが気になってるんですけど、
勉強した方がいいコード書けるようになりますか?
winのアプリの性能が上がるとか、効率がよくなるとかなら勉強しようと
思うんですが、詳しい人教えてください。
219:デフォルトの名無しさん
05/11/15 21:33:56
じゃぁまずMFC使うのやめれ
220:デフォルトの名無しさん
05/11/15 21:36:09
MFCとSTLは競合するので同時に使用するのは無理ですよ
221:デフォルトの名無しさん
05/11/15 21:41:11
STL は汎用的な部品であって求めるべきなのは実行効率ではなく、開発効率じゃまいか?
222:デフォルトの名無しさん
05/11/15 21:41:33
>>218
そういうことを人に聞くような奴には使いこなせないと思う
223:デフォルトの名無しさん
05/11/15 21:46:02
>>220
偽。
>>221
何もかもインライン関数で書かれているからなんだかんだいって実行速度だって遅くない。
>>218
とりあえずMFCのコレクションクラスを使わずにSTLのコンテナクラスを使うことから始めてみろ。
224:デフォルトの名無しさん
05/11/15 21:47:55
>>219-220
普通にMFCでSTL使ったアプリを作って納品したことがあるのだが、
MFCとSTLが競合するとはどういうことなのか説明していただけるか。
225:デフォルトの名無しさん
05/11/15 21:49:13
>>218
コンテナクラス各種のことなら、使い方を間違うと性能を落とす可能性もあるが
保守性と開発効率と信頼性に効果があることが多い。
<algorithm>のような関数テンプレートのことなら、修得に難があるが
保守性と開発効率と信頼性に効果があることが多い。
>>219
んな無体な。
>>220
詳しく。
226:デフォルトの名無しさん
05/11/15 21:51:53
>>224
わしゃ、使うのやめろとは言ったが競合するとは言っとらんぞ
227:デフォルトの名無しさん
05/11/15 22:05:41
マルチスレッドのとき競合する事がある
228:デフォルトの名無しさん
05/11/15 22:08:35
>>227
それはMFCとSTLの競合ではないだろ。
229:224
05/11/15 22:22:54
>>226
大変失礼いたしました。てっきり同一人物かと早合点。
230:デフォルトの名無しさん
05/11/16 00:37:35
気になったのでぐぐってみた。
URLリンク(support.microsoft.com)
Q5 : MFC (Microsoft Foundation Classes) アプリケーションで標準 C++ ライブラリを使用した場合、C ランタイム ライブラリとの競合は発生しますか。
A5 : 競合は発生しません。MFC では、標準 C++ ライブラリと競合する C ランタイム関数は使用されていません。
とはいってもMSなので、地雷があったりするのかもしれんが。
231:デフォルトの名無しさん
05/11/16 00:43:06
ここで言ってる競合の意味は?「スレッドセーフでない」という意味?
必要に応じて自分で排他処理を埋め込む必要があるのはMFCだって同じ。
232:デフォルトの名無しさん
05/11/16 01:19:30
ちょい古めのMFCでは CreateThread で作ったスレッドで
Cランタイムライブラリ使うとメモリ損失をおこすのでダメ、
でもってSTL も shuffle やらに rand() 使ってたりするんでダメって話題じゃないの?
233:デフォルトの名無しさん
05/11/16 01:23:44
>>232
MFCとSTLの競合とはちょっと意味合いが違うような。
有益な情報だが。
234:デフォルトの名無しさん
05/11/16 04:30:42
下手の考え 休むに似たり
235:デフォルトの名無しさん
05/11/16 06:59:04
>>232
MFCを使った場合も同様。
MFCのクラスや関数を使う場合はAfxBeginThread()を使わなければならない。
STLだけを敬遠する理由にならない。
236:デフォルトの名無しさん
05/11/16 19:10:29
ようじょにインサートするにはどのクラスを使えばいいの?
237:デフォルトの名無しさん
05/11/16 20:08:17
MFC使うとモッサリするからなるべくATL+STLでやる
238:デフォルトの名無しさん
05/11/16 20:57:45
ATL使うぐらいなら
COM+SDKでオナニーした方がまし
239:デフォルトの名無しさん
05/11/16 21:30:49
ATL自体には全くといっていいほど魅力がないのだが、
WTLを使う場合に必要なのでいつのまにかATLを使ったことになる。そんな感じ。
240:デフォルトの名無しさん
05/11/16 21:37:14
ATLはATL::CA2Wみたいな文字列変換関連が便利。
あとGetWindowLongPtrなんかをきちんとinline関数で定義しなおしてくれるのがありがたい。
241:デフォルトの名無しさん
05/11/16 23:26:45
ATLはこれ作った奴はイカれた天才だと分かるが
MFCを見るとこいつは俺なみにバカだなと思う
この差はなにか。予算が違うのか
242:デフォルトの名無しさん
05/11/16 23:34:35
単に設計された時代の差。
243:デフォルトの名無しさん
05/11/17 02:39:52
そんないいわけは通用しない!
なんだあのコントロールバーは!
244:デフォルトの名無しさん
05/11/17 20:49:21
listでeraseを使っているとassertに引っかかりました
eraseを使っている行が原因だということまでは突き止めましたが
何が原因かわからないので教えてください
for (it=mylist.begin() ; it!=mylist.end() ; it++)
{
if (条件)
{
it=mylist.erase(it);
}
}
Expression: list iterator not incrementable
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
245:デフォルトの名無しさん
05/11/17 20:50:43
>>244
> Expression: list iterator not incrementable
これ読め。
246:デフォルトの名無しさん
05/11/17 20:55:06
>>245
>リストイテレータは加算できません
だと思うのですが何のことやらさっぱりです
加算といえばit++のことを指しているのでしょうがこれを無くすわけにもいきません
よろしくお願いします
247:デフォルトの名無しさん
05/11/17 20:55:41
お断りします
248:デフォルトの名無しさん
05/11/17 20:56:58
>>247
私のことを弄んだのですか?
249:デフォルトの名無しさん
05/11/17 20:57:13
>>244
つlist<>::remove_if()
250:デフォルトの名無しさん
05/11/17 21:04:00
>>246
ヒント: eraseの戻り値がend()かもしれない
251:デフォルトの名無しさん
05/11/17 21:07:25
>>249-250
ありがとうございます、理解できました
eraseがend()を指しているのにさらにit++してしまったのですね
remove_ifを使えば目的は達せられそうです
本当にありがとうございました
252:デフォルトの名無しさん
05/11/18 00:31:36
イテレータの不正領域インクリメントをassert()で教えてくれてるうちは、まだいい方でしょ。
インクリメント演算子の中で無限ループされた日には(ry
ブレークポイント置いてもどこで無限ループに突入したのか分からず困ったことがある。
253:デフォルトの名無しさん
05/11/18 01:24:47
アセンブラ読めないお前がヘタレすぎるだけだろ
254:デフォルトの名無しさん
05/11/18 07:50:40
つーか、ループ判定に使ってるイテレータを
わざわざeraseの戻り値で更新してるのがバカなだけだろ
255:デフォルトの名無しさん
05/11/18 09:30:07
要するに馬鹿と。
256:デフォルトの名無しさん
05/11/18 10:03:31
>>159
> boost::string_algoみたいに非メンバでもっと汎用的に実装できなかったものか
boost::string_algoは標準化される見込みが高いです。
URLリンク(www.open-std.org)
まあtemplateがなかった頃に設計されたものだからね。
専用のださメンバ関数は徐々にdeprecatedになっていくといいんだけど…
257:デフォルトの名無しさん
05/11/18 10:05:50
>>242
いや、MFC出た時点で、設計者はうすらとんかちだと思った。
258:デフォルトの名無しさん
05/11/18 15:24:37
>>254
いいえ、それ自体は普通の行動ですね。
バカなのは、それを「上手くやれない」人と、「それ自体がバカだと思っている」人だけです :-)
259:デフォルトの名無しさん
05/11/18 17:31:41
まぁそうむきになるなよw
260:デフォルトの名無しさん
05/11/18 18:10:53
>>257
「うすらとんかち」なんて単語見かけたの20年ぶり位かも。
261:デフォルトの名無しさん
05/11/18 18:38:33
うすらとんかち
262:デフォルトの名無しさん
05/11/18 19:42:33
>>256
うは、マジすか
次の規格改訂はshared_ptやらbindやらstring_algoやらで
かなり使い勝手が良くなりそうですな
263:デフォルトの名無しさん
05/11/18 19:57:45
標準化委員会はそんなに甘くない。
互換性という壁によって砕け散るだろうね。
264:デフォルトの名無しさん
05/11/18 21:51:31
とりあえずfilebufのコンストラクタにwchar_tなfilenameを渡せるようにしてくれると助かる。
Windowsだとそれなりに便利なのさ。なけりゃ自分で書くだけなんだけど。
265:デフォルトの名無しさん
05/11/18 21:57:47
正直標準にならなくてもboostがしっかり存在し続けていれば
それで良いような気がする。
266:デフォルトの名無しさん
05/11/19 01:32:10
>>264
URLリンク(www.open-std.org)
これのwstring版が欲しいって事だよね。
267:デフォルトの名無しさん
05/11/19 09:12:26
>>264
C++ 0xでfstream類のコンストラクタにFILE *を引数に取るコンストラクタを設けるという提案があった気がする。
これが実現すれば_wfopenが使えるようになって、それだけでもだいぶましなるのではと俺は思っている。
268:デフォルトの名無しさん
05/11/19 11:41:11
vectorって何でサイズ拡張するときにコピーコンストラクタとデストラクタを呼ぶの?
メモリ確保してデータを移動するんだったら↑のを呼ばなくても
ただmalloc→memcpy→freeだけでいいと思うんだが
269:デフォルトの名無しさん
05/11/19 12:19:53
そこまで単純なものじゃないから
270:デフォルトの名無しさん
05/11/19 12:30:44
いくらなんでも頭悪すぎだろ・・・
268はどんなクラス設計してきたんだ?
もしライブラリ自作してたらこいつのだけは
絶対使いたくないな。
271:デフォルトの名無しさん
05/11/19 12:33:14
いや、お前には使わせないから大丈夫(^o^)
272:デフォルトの名無しさん
05/11/19 13:04:21
頼まれても使わないから大丈夫(^ω^)
273:デフォルトの名無しさん
05/11/19 13:06:36
>>268
C使っときなさい。
274:デフォルトの名無しさん
05/11/19 13:13:13
まぁ、stlのvectorは無駄が多いのは周知の事実なわけだがな
275:デフォルトの名無しさん
05/11/19 13:23:22
無駄が多いのはおまいの設計が悪いだけ
276:デフォルトの名無しさん
05/11/19 13:35:05
低能はvbでも使っとけ
277:デフォルトの名無しさん
05/11/19 13:45:37
vectorを使ったとしても、プログラマはリソースの明示削除手続きから解放されるだけであり、
無駄が出ないように工夫する義務はプログラマにある。
278:デフォルトの名無しさん
05/11/19 13:55:40
まだvb馬鹿にしてる奴がいるのか、さすがstl厨
279:デフォルトの名無しさん
05/11/19 14:10:26
VBは所詮VB
280:デフォルトの名無しさん
05/11/19 16:07:53
STLとSTOってどっちがつおいの?
281:デフォルトの名無しさん
05/11/19 16:16:46
>>268
たとえばわざとらしいけどこういうクラスをvectorの要素にすることを考えてみたらいい。
class hoge
{
public:
hoge(int n) : num(n), p(this) {}
hoge(const hoge& x) : num(x.num), p(this) {}
int get() const {return p->num;}
private:
int num;
const hoge *p;
};
282:デフォルトの名無しさん
05/11/19 16:18:04
>>280
答えはキミの中にあります
283:デフォルトの名無しさん
05/11/19 17:17:07
コピーコンストラクタがいやなら shared_ptr 使うか、
vector<hoge* > ってすべきだな。
あとインスタンス化のたびに競合おこしたりとかいうのもあるし、
初期化~終了までファイルロックする類のクラス作ったりすると。
284:デフォルトの名無しさん
05/11/19 19:30:38
boost::ptr_vectorでもよい。
285:デフォルトの名無しさん
05/11/21 17:47:41
class FinallyCloseHandle {
private:
HANDLE h_;
public:
FinallyCloseHandle(HANDLE h) : h_(h)
{ if (h==INVALID_HANDLE_VALUE) throw; }
~FinallyCloseHandle() { CloseHandle(h_); }
};
というクラスを用意して
HANDLE file = CreateFile(...)
auto_ptr<FinallyCloseHandle> fch(new FinallyCloseHandle(file));
として、スコープを抜けるときに自動解放するようにしてるんですが、
これを汎用的に行う方法はないでしょうか
CloseHandle以外にも、いろいろ終了処理はありますが、
それに対して毎回似たようなクラスを作るのは、スマートとは思えません
atexitみたいな形で、スコープを抜けるときに呼び出す関数を
積んでおくことができると理想なのですが
286:デフォルトの名無しさん
05/11/21 17:56:11
boost::move_ptrやshared_ptrみたいに削除子を指定するのはダメ?
287:デフォルトの名無しさん
05/11/21 18:10:35
>>286
サンキュー!そのものズバリが見つかったーよ
URLリンク(boost.cppll.jp)
以前、どこかのWebでスコープを抜けるときにコードを実行できるようなことを読んだ覚えがあって、
「スコープ 終了処理 指定」とかいろいろぐぐっても、なかなか見つけられなかったけど、
削除子で検索したら一発でした
288:デフォルトの名無しさん
05/11/21 18:59:33
その手のテクニックなら ScopeGuard も候補になるかな.
289:デフォルトの名無しさん
05/11/21 21:01:19
>>285
FinallyCloseHandle hFile = CreateFile(...);ではだめなのか?
290:デフォルトの名無しさん
05/11/22 00:49:20
>>288
さんくす!ScopeGuardも調べてみた
URLリンク(www.kmonos.net)
ここに実装例があったけど、ようは終了処理の関数と引数の参照を入れとくのね
勉強になります
>>289
あ、newじゃなくても良いですね
287に書いていますが、以前、どこかのwebでこの方法を見たとき
おぼろげにテンプレートを使って実現していたような覚えがあったので、
こんな風な書き方になってました
291:デフォルトの名無しさん
05/11/22 12:22:58
(数値地図から)200×200の数の行列?を読み込まし、iと、i+1と、j、 j+1で四点をとり、その4点の一番大きい値から小さい方へいくプログラムがつくれません
参照できるサイトありますか?わかる人いますか?ヒントください><
もう三ヶ月悩んでます、助けて
馬鹿な為ほんとプログラムわからないんです
292:デフォルトの名無しさん
05/11/22 12:31:21
>>291
マルチ死ね
293:デフォルトの名無しさん
05/11/22 20:16:26
指定した条件に合致したインスタンスを指すイテレータを返す関数を作るときは
その返却値となるイテレータにNULLを使っていいんでしょうか?
294:デフォルトの名無しさん
05/11/22 20:25:50
>>293
つ[std::find_if()]
295:デフォルトの名無しさん
05/11/22 20:29:51
普通はendが返るんじゃね?
296:デフォルトの名無しさん
05/11/22 20:30:05
>>293
NULLはポインタにしかない。
297:デフォルトの名無しさん
05/11/22 21:53:50
>>294
うあ、そんな便利なものが…。
使ってみます。ありがとうございました。
>>295
>>296
なるほど。
std::find_if()してきて、それがend()かでエラー判定するんですね。
ありがとうございました。
298:294
05/11/22 23:17:49
<algorithm>や<numeric>はその手のロジックの宝庫だからね。
この辺に慣れるとちょっとした集計なんかがループを書かずにできる。
299:デフォルトの名無しさん
05/11/24 00:24:57
ちと古いネタにレスします
C++は一週間ぐらい前に始めたばかりなのでよくわかってないかもしれないけど、その辺はフォローよろしくです。
>>267
FILE * からfstreamを生成する場合、FILE*のクローズの責任(というよりFILE*の所有者)は誰になるのでしょう?
古いVCだとFILE*からfstream作った時は明示的にclose()呼ぶようにとか書いてあったような気がするんだけど、これじゃあまり使い道が・・・
自分で作ったfstream(Widefilename版)だとFILE *から作ってもデストラクタでクローズしてしまいます。
fstream(_wfopen(...))みたいな使い方を想定してます。
300:267
05/11/24 07:48:28
>>299
すまん。
たまたま耳にしただけであって,そこまで詳しいところは読んでいない。
でも俺が作るとしたら後者の方式(fstreamが所有権を持ちデストラクタでクローズする)にするな。
301:デフォルトの名無しさん
05/11/24 08:35:29
gcc拡張のstdio_filebuf, stdio_sync_filebufは、closeなし。
cin, cout, cerrのfilebuf先は、main()出た後のstdin, stdout, stderrのclose任せ。
302:デフォルトの名無しさん
05/11/24 18:25:52
ofstream ofs("output", ios::out | ios::binary);
list<int> mylist;
for (int i = 0; i < 10; i++)
mylist.push_back(i);
copy(list.begin(), list.end(), ostream_iterator<int>(ofs));
これで
00 00 00 00 01 00 00 00 02 00 00 00...というバイナリファイルが出来るという
わたしの願いは裏切られ、0123456789というテキストファイルが出来た。
なぜだろうね?
303:デフォルトの名無しさん
05/11/24 18:46:50
>>302
ios::binaryってフラグは、CR+LFのようなOS依存コードをcookedではなくて
rawで書け、って意味。
std::ostream_operator<int>←って指定してるじゃん。これじゃあ << で
出力したのと全く同じ。
バイナリで書きたければwrite()を使いなせえ。
304:デフォルトの名無しさん
05/11/24 18:50:17
あ、put()でもいいよ。
305:デフォルトの名無しさん
05/11/24 18:53:43
どうしてもアルゴリズムでバイナリを出力したければ、ユーザー定義の
バイナリ出力反復子を作るか、<<を多重定義し、バイナリ出力
専用のクラスを作り、for_eachで渡すか、だなあ。
306:302
05/11/24 19:23:10
詳しくありがとう。
307:デフォルトの名無しさん
05/11/24 19:46:18
反復子のユーザ定義は、traitsの引き継ぎが面倒なので、バイナリ出力
クラスを作ってみた。
#include <fstream>
#include <list>
#include <algorithm>
class OutBin {
std::ofstream& of;
public:
OutBin(std::ofstream& ofs) : of(ofs) {}
void operator()(int i) {
of.put(static_cast<char>(i));
}
};
int main()
{
std::ofstream ofs("output", std::ios::out | std::ios::binary);
std::list<int> mylist;
for (int i = 0; i < 10; i++)
mylist.push_back(i);
std::for_each(mylist.begin(), mylist.end(), OutBin(ofs));
}
308:デフォルトの名無しさん
05/11/24 20:07:49
これも反復子に手を加えない一例。std::copy()が使える。
#include <ostream>
#include <fstream>
#include <list>
#include <algorithm>
#include <iterator>
class OutBin {
int j;
public:
friend std::ostream& operator<<(std::ostream& os, const OutBin& o);
OutBin(int i) : j(i) {}
};
std::ostream& operator<<(std::ostream& os, const OutBin& o)
{
os.put(static_cast<char>(o.j));
return os;
}
int main()
{
std::ofstream ofs("output", std::ios::out | std::ios::binary);
std::list<int> mylist;
for (int i = 0; i < 10; i++)
mylist.push_back(i);
std::copy(mylist.begin(), mylist.end(), std::ostream_iterator<OutBin>(ofs));
}
309:デフォルトの名無しさん
05/11/25 07:26:24
私は、fstream系をデバッグトレース出力にしか使わないなぁ。
とりあえずトレースしたいときは、色んな構造体に対して<<演算子がオーバライドされてると、便利だ。
でも、一般のファイルを読み書きする時は専らcstdioを使う。
皆さんはどう?
310:デフォルトの名無しさん
05/11/25 08:30:44
cstdio を使う理由なんて、互換性以外に何があるんだ。
使いわけたりしねぇよ…。
311:デフォルトの名無しさん
05/11/25 09:14:02
fstreamって何でこうもまあ低速なの?
312:デフォルトの名無しさん
05/11/25 09:58:43
>>310
iostream・fstreamはファイルサイズが無駄に大きくなる。
ちょっとしたコンソールアプリには、iostreamは大げさすぎる実装だ。
313:デフォルトの名無しさん
05/11/25 10:31:01
今時数十KB増えるくらい蚊に刺されたようなもんじゃん。
314:デフォルトの名無しさん
05/11/25 10:55:12
>>312
それなら C 使えば?
315:デフォルトの名無しさん
05/11/25 12:38:37
また莫迦が STL スレで stream の話してるよ…
316:デフォルトの名無しさん
05/11/25 12:45:01
>>315
過去ログと空気は読む物ってことだわな
317:デフォルトの名無しさん
05/11/25 12:55:52
まぁSTLという言葉の定義に持ち込む>>315のほうが馬鹿だけどね。
318:デフォルトの名無しさん
05/11/25 13:07:39
>>307-308
便乗で申し訳ないが、basic_ostream< wchar_t > への対応版も希望
319:デフォルトの名無しさん
05/11/26 10:46:08
URLリンク(dl.njfiw.gov.cn)
320:315
05/11/29 16:18:06
>>316-317
初代スレから居るが。
時々思い出したように粘着しているだけだ。
321:デフォルトの名無しさん
05/11/29 19:07:08
>>320
? お前はまさにそこをイジられてるんだが、何をわざわざ説明してるんだ?
322:デフォルトの名無しさん
05/11/29 22:18:12
>>318
亀レスだが、コンストラクタを変換関数の代わりに使っているので、
OutBin(wchar_t)と、intとwchar_tを受け取った場合のフラグでも
増設して、operator<<の動作を切り替えればいいやん。
323:デフォルトの名無しさん
05/11/30 19:03:24
vector とかよりももっと複雑な、
一般のグラフ構造のリンク関係を持ったアイテム集合を
うまく扱うためのコンテナクラスライブラリってありませんか?
324:デフォルトの名無しさん
05/11/30 19:03:55
コンテナクラスライブラリってあんまり使わないみたいなんで
テンプレートクラスライブラリって言い換えます。
325:デフォルトの名無しさん
05/11/30 19:09:37
クラステンプレートであってテンプレートクラスではない。
STLには存在しないがboost::graphというものは存在する。
326:デフォルトの名無しさん
05/11/30 21:57:09
質問です。
以下のテンプレートクラスのstd::map<KEY, VAL>::iterator
の部分でコンパイルエラーが発生します。
コンパイルを通す方法ありますか?
環境: g++ 3.4.2
template<typename KEY, typename VAL>
class MyMap : public std::map<KEY, VAL>
{
public:
MyMap()
{
std::map<KEY, VAL>::iterator it = begin();
}
};
327:デフォルトの名無しさん
05/11/30 22:00:53
>>326
typename std::map<KEY, VAL>::iterator...
328:デフォルトの名無しさん
05/11/30 22:09:59
>>327
ありがとうございます。
どうしてtypenameをつけるとコンパイル通るんですか?
329:デフォルトの名無しさん
05/11/30 22:20:14
>>328
URLリンク(www.fides.dti.ne.jp)
330:デフォルトの名無しさん
05/11/30 23:11:44
>>329
停滞してるな
331:デフォルトの名無しさん
05/11/30 23:12:31
逃した魚は大きいぞ
332:デフォルトの名無しさん
05/11/30 23:59:56
>329
そこを読んで思ったんだが、
typedefの時にtypenameを書かないと通らないコンパイラってあるの?
typedefの引数?は型名に決まっているんだから必要ないように思えるだが。
333:デフォルトの名無しさん
05/12/01 00:14:14
>>332
そうやって勝手に標準規格をねじ曲げたのがVC7.1だろう。
VC7.1だけ使ってると、typenameが必要だって事が学習しにくい。
334:デフォルトの名無しさん
05/12/02 01:38:49
7.1はわりとtypenameについて忠実じゃなかったっけ?
6が酷かったのは覚えているが。
335:デフォルトの名無しさん
05/12/02 02:07:50
いや全然
336:デフォルトの名無しさん
05/12/02 02:12:05
そうか気のせいだったか。
337:デフォルトの名無しさん
05/12/04 20:17:12
>>333
typenameなんていらないじゃん。未熟なコンパイラを救うためだけのもんだろ。
338:デフォルトの名無しさん
05/12/04 20:21:40
>>337
typename は未熟な C++ 言語仕様を救うためのもんだよ。
コンパイラベンダがどうこうするもんじゃない。
339:デフォルトの名無しさん
05/12/04 20:30:15
即ち禿がC++に毛を生やす努力をすればtypenameはいらない。
340:デフォルトの名無しさん
05/12/04 22:16:07
お前らいつもいつも禿禿って…いい加減にしろよ?
341:デフォルトの名無しさん
05/12/04 22:42:49
あ、びょーん先生こんにちは。
今日も落ち武者ヘアー似合ってますよ。
342:デフォルトの名無しさん
05/12/05 22:45:19
vectorの安全性に関する質問です。
先頭要素のポインタを取得して、それを進めた場合
正しいアドレスを指す保障はありますか?
int *p;
std::vector<int> ivec;
ivec.push_back(100);
ivec.push_back(200);
ivec.push_back(300);
p = &ivec[0];
p++;
p++;
printf("%d", p);
一応これの出力は300と出ます。
343:デフォルトの名無しさん
05/12/05 22:53:11
>>342
vector<bool> 以外はある。
23.2.4-1
The Elements of a vector are stored contiguously, meaning
that if v is a vector<T, Allocator> where T is some type
other than bool, then it obeys the identity
&v[n] == &v[0] + n for all 0 <= n < v.size().
344:デフォルトの名無しさん
05/12/05 22:55:11
事前条件として !ivec.empty() に注意ね
345:デフォルトの名無しさん
05/12/07 19:20:03
Boostを使わずにSTLのみで、スマートにcsvファイルを読み込めたりする?
346:デフォルトの名無しさん
05/12/07 19:27:03
>>345
RFC4180を見る限り、スマートにってのは無理みたいだね。
347:デフォルトの名無しさん
05/12/07 19:33:15
>>346 そんな RFC があったのか・・・
348:デフォルトの名無しさん
05/12/07 20:00:03
たしか超最近出来たRFCだろそれ
349:デフォルトの名無しさん
05/12/07 20:56:06
>>346
そんなのあったのか
つかC/C++でCSVファイルを読むのはクソだるいんだよな
書くのは楽なんだが。
350:デフォルトの名無しさん
05/12/07 21:18:00
Java だと楽なの?CSVファイル読むの。
いや、俺、Javaほとんど使ったことないから。
351:デフォルトの名無しさん
05/12/07 21:43:47
CSVつってもExcel仕様のCSVとか色々あるんじゃないの。
引用符の処理や複数行のセルとかどうすんだとか。
352:346
05/12/07 22:26:19
>>347-349
今年10月にできてる
353:デフォルトの名無しさん
05/12/08 00:43:10
URLリンク(www005.upp.so-net.ne.jp)
ここの雛形を使ってイテレータを作ってみようと思ったんですが、
'iterator' : 定義されていない基本クラスが宣言されています
となってしまいます。
#include <iterator>
の他にする事があるんでしょうか?
354:デフォルトの名無しさん
05/12/08 00:57:48
名前空間じゃね?
355:デフォルトの名無しさん
05/12/08 01:06:30
>>354
using namespace std;
または
std::iterator
としたらすんなり通りました。
ありがとうございました。
356:デフォルトの名無しさん
05/12/08 01:18:01
RFCってのは4月にチェックするものだと言うすり込みがあるのでしらんかった。
357:デフォルトの名無しさん
05/12/08 01:23:57
さすがにそれはどうかとw
確かに俺も毎年4月は確認するけどさwww
358:デフォルトの名無しさん
05/12/08 01:51:41
>>350
Javaは標準ライブラリに、StringTokenizer があるから、
少なくとも、C++標準だけでやるよりは楽。
359:デフォルトの名無しさん
05/12/08 01:53:16
>>358
StringTokenizerはCSVのパーシングにおいては何の役にも立たないと思うぞ
360:デフォルトの名無しさん
05/12/08 01:55:19
そうなの?
まぁ、でもRegexあるけど。
361:デフォルトの名無しさん
05/12/08 01:56:38
>>360
人に聞く前に>>346にせっかく挙がってるRFC嫁よ
362:デフォルトの名無しさん
05/12/08 02:25:12
a","b""bb","ccc CRLF
ヒドス
でもBNFがあったのですぐ解った
363:デフォルトの名無しさん
05/12/08 06:39:02
CSVが難しいのは、ハウス規格がたくさんあるからで、
>>358>>359>>360の言っているような問題じゃない。
>>362
Shift_JISだと、あのBNFじゃ駄目だけどね。
364:デフォルトの名無しさん
05/12/08 11:47:10
あー、RFCだから仕方ないけどCrLf限定になってるし2バイト文字が通らない。
これもまた実態に合わないのか。
365:デフォルトの名無しさん
05/12/08 12:02:30
Category: Informational
366:デフォルトの名無しさん
05/12/08 13:55:59
CSVなんかはPerlで読んじゃうな
前処理させとくだけでもずいぶん楽だし
367:デフォルトの名無しさん
05/12/08 20:25:06
>>366
正しいと思う。
CSVファイル読込が全体に占める消費時間は微々たる物になるケースがほとんどだし。
368:デフォルトの名無しさん
05/12/09 04:06:12
RFC 書いた人、実体分かって書いてるのかな。
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
もうこれ以上
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4267日前に更新/228 KB
担当:undef