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

このエントリーをはてなブックマークに追加
528デフォルトの名無しさん
wstringを使おうとしたところ、undeclaredのエラーが出ました。
#include <string>とusing namespace stdは書いてあります。
Cygwinとg++を使っています。
何がいけないのでしょう。
529デフォルトの名無しさん:04/11/09 20:01:54
>528
・エラーメッセージを勝手に省略しない
・ソースコードの原因となっていそうな部分は最低限提示する
530528:04/11/09 20:06:16
とりあえずソースはこれだけです。
#include <string>
using namespace std;
int main()
{
  wstring s;
  return 0;
}

エラーメッセージは
main.cpp: In function `int main()':
main.cpp:6: error: `wstring' undeclared (first use this function)
main.cpp:6: error: (Each undeclared identifier is reported only once for each
function it appears in.)
というものです。
531デフォルトの名無しさん:04/11/09 20:15:41
>>528
>何がいけないのでしょう。

g++
532デフォルトの名無しさん:04/11/09 20:29:06
インクルードパスのstringヘッダみりゃ分かるけど多分wstringのtypedefがコメントアウトされてる。
533528:04/11/09 20:29:18
cygwin以外にも、LinuxとSolarisで試しましたが、やはり同じエラーが出ました。

>>531
g++とだけ言われても分かりません。
534デフォルトの名無しさん:04/11/09 20:33:22
>>533

g++ で wchar_t まわりをあてにしてはいけません。
はっきり言ってウンコです。
535528:04/11/09 20:40:23
ヘッダを見ると確かにコメントアウトされていました。
typedef basic_string <wchar_t> wstring;
を自分で定義してコンパイルは通ったのですが、なんでコメントアウトされてるんでしょう。
そもそもwstringはANSIで標準化されているはずだと思うんですが、
ANSIの標準ってあまり当てにならないんでしょうか。
ともかく、どうもありがとうございました。
536デフォルトの名無しさん:04/11/09 20:41:59
>>534が全て。
537デフォルトの名無しさん:04/11/09 20:45:39
>ANSIの標準ってあまり当てに
C++のコンパイラってのは、準拠度を競ってるレベルだ、すごいだろ。
538デフォルトの名無しさん:04/11/09 21:07:44
Vine2.6?
wstringがdefaultで使えんのは2.9xまで。3.xになるとOK。
2.9xのテンプレート周りは3.xに比べるとゴミ。
だからVineスレであれだけgcc3にしろと騒がれてた。
539デフォルトの名無しさん:04/11/09 21:12:12
cygwinではgcc3にすると完全にwstringが使えなくなりますが、なにか?
540デフォルトの名無しさん:04/11/09 21:15:51
なんかはらがたってきた にゃんにゃん
541デフォルトの名無しさん:04/11/09 21:19:23
なんか○○がたってきた にゃんにゃん
542デフォルトの名無しさん:04/11/09 21:19:57
にゃおーん
543デフォルトの名無しさん:04/11/09 21:20:31
なんか○○が○○てきた にゃんにゃん
544デフォルトの名無しさん:04/11/09 21:32:41
C++やるなら、正直GCCってゴミみたいな物だから。
あまり期待し過ぎないほうがいい。
545デフォルトの名無しさん:04/11/09 21:34:15
localeまわりなんて商用じゃないと手が回らないからね。
546デフォルトの名無しさん:04/11/09 21:36:07
2.9xでも使えないことはないよ。
ヘッダをいじってwstringの定義を復活させて
c_str()のところでcharの"\0"を返すところでエラーが出るので、
そこをちょめちょめすると使える。
あとはwcout/wcinがないのと、
定数のL"ABC"形式が使えんので自力で何とかすること。
実際にこれで仕事してたけど何ともない。
547デフォルトの名無しさん:04/11/09 21:38:23
>>544
gcc3はborlandやVC6に比べればすんなりboostが使えるし
Linux上なら実行ファイルの巨大化もないのでいい感じ。
548デフォルトの名無しさん:04/11/09 21:40:35
Linuxだと巨大なランタイムが標準で入ってるようなもんだからね
549デフォルトの名無しさん:04/11/09 21:42:23
>>547
そうそう、gcc3は一番標準に近いよね。
マイクロソフトのQuickCなんてC99にすらまったく準拠していないし、
ボーランドのTurboC2.0とかもぜんぜん準拠していないしね。
それどころか、STLさえ付いていない。
gccの圧勝。
550デフォルトの名無しさん:04/11/09 21:47:33
VBもwstring使えないんだよなw
ダメダメだな、マイクロソフトw
551デフォルトの名無しさん:04/11/09 21:54:52
>>546
そこまでするなら、素直にCの範疇でやってれば良いのに・・・
わざわざC++使おうとするメリットって何?
552デフォルトの名無しさん:04/11/09 21:57:31
>>549
いや、まだC99もSTLもなかったころのもんだろ。

これって釣られた?
553デフォルトの名無しさん:04/11/09 21:57:53
>>551
大した事じゃない
554デフォルトの名無しさん:04/11/09 22:02:29
VC6も10年前の製品だよな。
何でVC2003と比較しないんだろ。
555デフォルトの名無しさん:04/11/09 22:17:57
>>551
Cはメンドイ。
>>554
VC2003がベストだな。でもその次はgcc3だな。
556デフォルトの名無しさん:04/11/09 22:22:15
ボーランドはもうやる気ないの?
557デフォルトの名無しさん:04/11/09 22:26:22
BCCの次のバージョンは100%ISO互換でexport対応だと豪語してたが。
558デフォルトの名無しさん:04/11/09 22:31:52
exportイラネ
559デフォルトの名無しさん:04/11/09 22:37:11
>>550
いつから gcc はマイクロソフトのものになったんだ?w

>>556
やる気もなにも上から下まで中の人が入れ替わってて
ブランドを引き継いでいるだけの事実上もう別の会社だろ。
560デフォルトの名無しさん:04/11/09 22:40:13
>>555
自力で何とかすることとか書いておいてメンドイってどういうことなんだろ?
わざわざGCC使ったりいまいち意味がわからない。
561デフォルトの名無しさん:04/11/09 22:40:37
>>555
今やVC++7.1だけではなく、icc-8.1もCW9.2もboost100%でありgccはかなり遅れたコンパイラ。
562デフォルトの名無しさん:04/11/09 22:42:36
gccがかなり遅れたコンパイラなら
bccはゴミ未満だな
563デフォルトの名無しさん:04/11/09 22:51:33
結論だけ書くと、VC6≒gcc3。
だいたいこんな感じ。
564デフォルトの名無しさん:04/11/09 22:54:22
>>563
それはない
565デフォルトの名無しさん:04/11/09 22:55:54
英語圏の人が主に開発してるから
wcha_tとかどうでもいいんだよ。たぶん
566デフォルトの名無しさん:04/11/09 22:58:36
UNIXユーザはやたらUCS敵視してるDQNとかたくさんいるしな
567デフォルトの名無しさん:04/11/09 22:59:18
>>564
すまん間違えた。
gcc3≒LSI-C86試食版。
大体こんな感じ。
568デフォルトの名無しさん:04/11/09 22:59:26
おまいらもっと開発に貢献汁!
569デフォルトの名無しさん:04/11/09 23:02:00
>>561
メンドイのは可変長のバッファサイズの管理。reallocとか。
ヘッダを数行いじるのは別にメンドクない。
570デフォルトの名無しさん:04/11/09 23:03:06
gccと試食版。
雑誌の付録についてくるところとか、ユーザが中学生ってところがそっくり。
これで勉強して大人になったら本物のコンパイラを買う。
571デフォルトの名無しさん:04/11/09 23:03:57
>>567
あやまれ!
LSI-C86試食版にあやまれ!
誰かAAお願い
572デフォルトの名無しさん:04/11/09 23:03:57
Intel-Cは動作条件としては単体では使えない代物なので
MSのやつの追加キットと考えるべきかと。
573デフォルトの名無しさん:04/11/09 23:04:36
>>569
文字列定数をワイド文字にするのはいいの?
あなた書き込みが相当おかしいですよ?
574デフォルトの名無しさん:04/11/09 23:06:34
>>562
えー、そのbccだってwstringぐらい使えるよーw
575デフォルトの名無しさん:04/11/09 23:07:04
>>572
ICC@Linuxは?
576デフォルトの名無しさん:04/11/09 23:12:35
えー、gccだってspiritくらいつかえるよー
577デフォルトの名無しさん:04/11/09 23:13:10
>>575
Linux版のicc-8.1はboost100%じゃないよ
578デフォルトの名無しさん:04/11/09 23:13:27
GCCはもともとCコンパイラだからな。
C++やりたいなら、まともなC++コンパイラ買わないと・・・
579デフォルトの名無しさん:04/11/09 23:15:29
>>576
spiritが使えないのとwstringが使えないのでは全然致命度が違うぞ。
wstringが使えないのはいくらなんでもお粗末過ぎる。
580デフォルトの名無しさん:04/11/09 23:16:57
>>573
うん、いいの。定数をワイドにする必要の有無に関わらず、
ネット上を流れたりディスク上に保存するデータはマルチバイトなので、
変換処理はいずれにしても必要。
仕様が統一されとらんワイドキャラで通信すると
クライアントとの互換性がまずいだろ。
581デフォルトの名無しさん:04/11/09 23:18:26
>>567

:.,' . : : ; .::i'メ、,_  i.::l ';:.: l '、:.:::! l::! : :'、:i'、: : !, : : : : : :l:.'、: :
'! ,' . : i .;'l;' _,,ニ';、,iソ  '; :l ,';.::! i:.!  : '、!:';:. :!:. : : : :.; i : :'、:
i:.i、: :。:!.i.:',r'゙,rf"`'iミ,`'' ゙ ';.i `N,_i;i___,,_,'、-';‐l'i'':':':':‐!: i : : '、
i:.!:'、: :.:!l :'゙ i゙:;i{igil};:;l'   ヾ!  'i : l',r',テr'‐ミ;‐ミ';i:'i::. : i i i : : :i
:!!゚:i.'、o:'、 ゙、::゙''".::ノ        i゙:;:li,__,ノ;:'.、'、 :'i:::. i. !! : : !:
.' :,'. :゙>;::'、⊂‐ニ;;'´          '、';{|llll!: :;ノ ! : !::i. : : : : i :
: :,' /. :iヾ、   `        、._. ミ;;--‐'´.  /.:i;!o: : : :i :
: ; : ,' : : i.:      <_       ` ' ' ``'‐⊃./. :,: : : O: i. :
: i ,'. . : :',      、,,_            ,.:': ,r'. : , : : !: :        あやまれ!
:,'/. : : . :;::'、     ゙|llllllllllllF':-.、       ,r';、r': . : :,i. : ;i : :     LSI-C86試食版にあやまれ!
i,': : : :.::;.'.:::;`、    |llllH". : : : :`、    ,rシイ...: : ; : :/:i : i:!::i:
;'. : :..:::;':::::;':::::`.、  |ソ/. : : : : : : ;,! ,/'゙. /.:::: :,:': :./',:!: j:;:i;!;
i. : .:::;:'i::::;':::::::::i::`:.、;゙、';‐ 、,;__;,/ノ  . :,/.:::: :/. : :/.:::i. j:;;;;;;;;
l .:::;:'::;':::;':::::::::::i::::i::`:,`'-二'‐-‐''゙_,、-.':゙/.:::: ;ィ': : :/.:::::i: j、;;;;;;;
.:::;:':::;':::;'::::::::::::::i:::i:::::..`'‐、、、-<゙.::::::::/.::: ://. : /.:::::::i :j::.'、:;;;
582デフォルトの名無しさん:04/11/09 23:19:19
>>580
文字列定数と外部データを同じ土俵で比較できるの?
だったら何故、内部コードにワイド文字を使おうとする?
あなた本当に仕事でそんなことしてるの?
大丈夫?いや、あなたじゃなくてあなたの会社。
583デフォルトの名無しさん:04/11/09 23:22:55
>>582
自前の正規表現マッチャやHTMLパーサがワイド専用だからだよ。
その方が性能がいいからね。
内部処理はワイド、外部はマルチ、これがポリシー。
584デフォルトの名無しさん:04/11/09 23:24:54
>>583
なら、文字列定数もワイドのはずでしょ?
それとも国際化のために文字列定数を持たないポリシーとか言い出すの?
ほんと、大丈夫?
585デフォルトの名無しさん:04/11/09 23:27:22
国際化のためじゃないの。
正規表現処理が高性能化するからだよ。
理由がわからなきゃ教科書嫁。
586デフォルトの名無しさん:04/11/09 23:28:20
>>585
はぁ?
高性能化のために文字列を持たないの?
頭おかしくなっちゃった?
587デフォルトの名無しさん:04/11/09 23:28:36
>>585って頭悪そう…
588デフォルトの名無しさん:04/11/09 23:29:01
>>585晒しage!
589デフォルトの名無しさん:04/11/09 23:29:56
うわ、すごい反応w
590デフォルトの名無しさん:04/11/09 23:30:47
ばかばかしい
591デフォルトの名無しさん:04/11/09 23:31:30
盛り上がってるみたいだが、いまいち展開がわからん。
誰か解説して。
592デフォルトの名無しさん:04/11/09 23:31:36
ワイドだと[あ-ん]とか出来るからとか言ったら真性だな
593デフォルトの名無しさん:04/11/09 23:35:43
つーか今、内部処理だけワイドってふつーじゃん。
MSでもCOMの機能使う時とかワイドに変換して引数渡すだろ。
594デフォルトの名無しさん:04/11/09 23:37:09
ワイド文字列定数を記述できないことが主題?
595デフォルトの名無しさん:04/11/09 23:38:49
>>593
普通だよ。
それを>>585が、文字列定数はマルチバイトのほうがいいって言い張ってる。
内部処理はワイドだけど文字列定数はマルチバイトってめんどくさいはずなんだが。
596デフォルトの名無しさん:04/11/09 23:41:38
(std::string(s) == CA2W(”あいうえお"))がそれほどめんどくさいと思うか?
597デフォルトの名無しさん:04/11/09 23:42:28
タイポだ(std:wstring(s) == CA2W(”あいうえお"))
598デフォルトの名無しさん:04/11/09 23:43:27
Cはメンドイってのが琴線に触れたっぽい。
599デフォルトの名無しさん:04/11/09 23:43:56
内部処理はワイドだけど、
オブジェクトへのデータ入力がマルチバイトのインターフェイスで統一されてるから
文字列定数もマルチバイトにしてるってだけの話ならわからんでもないんだが。
600デフォルトの名無しさん:04/11/09 23:44:06
>>596
L"あいうえお"よりいいと言い張る根拠は何なの?
しかも高性能化するってどういうこと?
わざわざそんなことする理由は何?
601デフォルトの名無しさん:04/11/09 23:44:49
>>596晒しage!
602デフォルトの名無しさん:04/11/09 23:45:19
なるほど、実質二人が戯れてるわけですね
603デフォルトの名無しさん:04/11/09 23:45:21
バッファオーバーフローの害について言及されている昨今、
固定長バッファのsprintfとか実にめんどくさいと思うんだが。
604デフォルトの名無しさん:04/11/09 23:45:58
くだらない議論はやめてー にゃんにゃん
605デフォルトの名無しさん:04/11/09 23:46:20
そこでstrstreamとみせかけてCString::formatですよ
606デフォルトの名無しさん:04/11/09 23:48:42
結論だけ書くとCStringが一番いい。
607デフォルトの名無しさん:04/11/09 23:52:34
boost::formatでいいじゃん。bcc55でもgcc3でもVC7でもOKだし。
608デフォルトの名無しさん:04/11/09 23:53:58
boost使うとサイズが一気に10倍に!?
あんなもん使えるかボケ
609デフォルトの名無しさん:04/11/09 23:57:31
かボケって何?
610デフォルトの名無しさん:04/11/09 23:57:54
サイズなんか気にすんな
611デフォルトの名無しさん:04/11/09 23:59:03
どうしたんだみんな、今夜はやけにノリノリじゃないか?
612デフォルトの名無しさん:04/11/10 00:07:41
HellowWorld表示するだけで4Mバイトのexeになる
wxWindows+mingw萌え
613デフォルトの名無しさん:04/11/10 00:09:57
>>612
さらにboost注入!
40MB!!すげー!!
614デフォルトの名無しさん:04/11/10 06:56:35
VC6 で string の挙動がおかしいです。誰か助けてください!

string str;
str.resize(4096);
str[0] = '*';
int n = str.size();

ここで n=4096 とならないといけないのに、
n=1 となってしまいます。
どうしてでしょうか?

string をバッファとして使いたくて上記のコードを書いているのですが、
うまくいかなくて悩んでいます。
615デフォルトの名無しさん:04/11/10 07:07:41
いくらVC6とはいえ、一文字しか入れてないのにsizeが1にならなかったらダメでしょう。
str.reserve(4096); としてみては?
616デフォルトの名無しさん:04/11/10 07:16:05
>>615
ありがとうございます。
resize() をしているので、4096 になるべきだと思いますが。。。

で、私の手違いだとということが分かりました。

void func(string* line)
{
line->resize(4096);
line[0] = '*';
int n = line->size();
}

こんなことをしていたので間違ってしまいました。
line はポインタなので

(*line)[0] = '*'

としたら正常に動作しました。
617615:04/11/10 07:17:44
と思ったけどresizeでも4096にならないとダメな気が…
VC6は窓から投げ捨てましょう
618デフォルトの名無しさん:04/11/10 07:18:43
>>614
VC++6.0+付属STLでやってみたが4096って出るが。
619デフォルトの名無しさん:04/11/10 07:42:24
C++なら小難しいポインタは捨ててできるだけリファレンスを使え。

void func(string& line)
620デフォルトの名無しさん:04/11/10 07:47:00
heapオブジェクトの参照はとれますか
621デフォルトの名無しさん:04/11/10 08:14:12
>>620
「heapオブジェクト」とは何ですか?
622デフォルトの名無しさん:04/11/10 08:30:22
const以外で参照を渡すのは見ていて吐き気がするのでやめてください
623デフォルトの名無しさん:04/11/10 08:35:46
中身を変えたい時はconst castですか?
624デフォルトの名無しさん:04/11/10 08:46:17
>>622
医者に診てもらえ
625デフォルトの名無しさん:04/11/10 10:00:55
>>622
上のスレの流れちゃんと見て発言してる?
626デフォルトの名無しさん:04/11/10 10:34:01
>>622
良かったな!大漁だぞ
627デフォルトの名無しさん:04/11/10 16:07:00
>>621
たぶんnewでメモリを確保したオブジェクトの事だろう。
628デフォルトの名無しさん:04/11/10 17:03:40
コピーコンストラクタが使えない時は
ポインタは使うしかないよね?
629デフォルトの名無しさん:04/11/10 18:45:32
>>628
オブジェクトのコピーだろ?
GCCなら、やり方によっては何もしなくても参照にしてくれるぞ。
630デフォルトの名無しさん:04/11/10 19:40:02
>>623-625
引数はポインタで受け取って、関数の頭で参照に入れればいい。
C++の参照渡しは呼び出す側は値渡しと同じ記述になってしまうので
後から見たときに値が変更されている可能性を発見しにくい。
値を変更するときは避けるのが常識。
C#ではout/refをつけることでこの問題を回避したね。
631デフォルトの名無しさん:04/11/10 19:45:04
>>630
それを言うならポインタだって同じじゃん。主張の意図がよくわからん。
632デフォルトの名無しさん:04/11/10 19:47:17
>>631
ポインタは&をつけるだろ。
633デフォルトの名無しさん:04/11/10 20:11:55
constやreferenceは、callerを見ても、それがそうであると解からん、
そういう話だな。
ポインタ渡しだと指標になる、と。
634デフォルトの名無しさん:04/11/10 20:12:11
>>632
そこまで行くとコーディングスタイルの問題だな。自分の常識を人に
むやみに押しつけないように。
635デフォルトの名無しさん:04/11/10 20:23:19
俺のコーディングスタイルだと、
ポインタ渡しするのは、ナルポインタを使いたいときだな。
636デフォルトの名無しさん:04/11/10 21:10:02
俺は値渡し以外認めないよ?
637デフォルトの名無しさん:04/11/10 21:51:33
参照アドレスの値渡し
638デフォルトの名無しさん:04/11/10 21:56:19
&記号が嫌いなので、俺はconstでない参照渡しをよく使う。
値を変更するかはヘッダで判断。
ただし、親オブジェクトを指定するのにはポインタ渡しを使う。
親からthisを渡す場合がほとんどだから。
639デフォルトの名無しさん:04/11/10 22:52:09
値渡しと参照渡しが判別しにくいと言ってる人に聞きたいのだが、
君らは前方宣言で引数の型の確認もせずに関数を使うのかい?
640デフォルトの名無しさん:04/11/10 23:13:38
>>639
コードを書くときの話じゃなくて可読性の問題。
少なくとも&がついてりゃそのことだけでアドレス渡しをしてることが
一目瞭然だけど、参照の場合、関数宣言を確認しないとわかんない。
641デフォルトの名無しさん:04/11/10 23:34:12
STLのstringの中で保持していると思われる文字列のバッファって、
デストラクタの中で解放されてるんでしょうか?
なんかメモリがどんどん増えているんですが。
普通、閉じ括弧(})に来たときにデストラクタって自動で呼ばれるんですよね?
他にnewやmallocは使っていないので、stringしか考えられないんですが。
642デフォルトの名無しさん:04/11/10 23:45:24
メモリが勝手に増えてくれたら嬉しくて悲鳴上げそうだ。
643デフォルトの名無しさん:04/11/11 00:12:54
>>642
ポケットのなかには ビスケットがひとつ
ポケットをたたくと ビスケットがふたつ
もうひとつたたくと ビスケットがみっつ

 たたいてみるたび ビスケットがふえる
644デフォルトの名無しさん:04/11/11 00:17:08
>>643
そんなふしぎなポケットがほしい
そんなふしぎなポケットがほしい
645デフォルトの名無しさん:04/11/11 00:22:48
          ,、‐ ''"  ̄ ``'' ‐- 、
        /イハ/レ:::/V\∧ド\
       /::^'´::::::::::::i、::::::::::::::::::::::::::::\
     ‐'7::::::::::::::::::::::::ハ:ハ::|ヽ:::;、::::::::::::丶
     /::::::::::::::/!i::/|/  ! ヾ リハ:|;!、:::::::l
    /´7::::::::::〃|!/_,,、   ''"゛_^`''`‐ly:::ト
      /|;ィ:::::N,、‐'゛_,,.\   ´''""'ヽ  !;K
        ! |ハト〈  ,r''"゛  ,       リイ)|
          `y't     ヽ'         //    あははははは
         ! ぃ、     、;:==ヲ   〃
         `'' へ、   ` ‐ '゜   .イ
              `i;、     / l
                〉 ` ‐ ´   l`ヽ
            / !        レ' ヽ_
         _,、‐7   i|      i´   l `' ‐ 、_
     ,、-‐''"´  ノ,、-、 / 、,_ ,.、- {,ヘ   '、_    `ヽ、_
   / i    ,、イ ∨ l.j__,,、..-‐::-:;」,ハ、 '、` ‐、_   ,`ヽ
  /  l ,、‐'´ // ',/!:::::::::;、--ァ' /  `` ‐   `'7゛   ',
 /   l  i  ´  く   ';::::::l  / /         /     ',
/     ! l      \ ';:::l , '  /        i/     ',
646デフォルトの名無しさん:04/11/11 00:24:54
ここは気色悪いスレですね
647デフォルトの名無しさん:04/11/11 02:14:00
>>643
ポケットのなかには ビスケットがひとつ
ポケットをたたくと ビスケットがふたつ

×もうひとつたたくと ビスケットがみっつ
○もうひとつたたくと ビスケットがよっつ
648デフォルトの名無しさん:04/11/11 02:20:35
ビスケットの数は増えていくが
一つ一つは小さくなって
結局総量は変わらないという罠
649デフォルトの名無しさん:04/11/11 02:26:42
>>647
まだまだあまあまちゃんねー にゃんにゃん
650デフォルトの名無しさん:04/11/11 03:10:50
for (i = 0; i < 1000; i++) { memset(&(std::vector<char>(100)[0]), 0, 100); }
これリークすると思ってるのかな?
651デフォルトの名無しさん:04/11/11 03:34:43
結局>>622は、個人の好みの問題を他人に押しつける基地外ってことだね。
652デフォルトの名無しさん:04/11/11 03:41:52
>>648
夢が無い人だな〜
653デフォルトの名無しさん:04/11/11 04:58:56
>>648
いや寧ろ、細かな破片が生じる分食べられる分量は減るところまで考慮しなければ。
#つーか、それって単なる破砕だね。
654デフォルトの名無しさん:04/11/11 07:18:44
しかし、誰が作ったんだろうな、こんなツッコミどころの多い歌。
655デフォルトの名無しさん:04/11/11 10:57:35
>>650
それはするべきじゃないだろう
656デフォルトの名無しさん:04/11/11 11:11:08
>>640
漏れも参照渡しは好きじゃない。理由は同じくソースの可読性
#define ByRef
とか書いて test( ByRef str ); とか書くのも気持ち悪いし
test( ByRef(str) ); もなんか違和感有るし
気持ち良い書き方は無いのかな・・
657デフォルトの名無しさん:04/11/11 11:21:55
つーか、ポインタ渡しとconstポインタ渡しだって関数呼び出し側だけじゃ区別つかないだろうに。
658デフォルトの名無しさん:04/11/11 11:36:59
>>657
明示的にキャスト書く
659デフォルトの名無しさん:04/11/11 11:54:12
最悪だぞそれ
660デフォルトの名無しさん:04/11/11 13:06:34
void assign_hello( std::string& str ){ str = L"Hello!"; }
はダメ、
void assign_hello( std::string& str ){ str.assign( L"Hello!" ); }
ならOK。
微妙な乙女心。
661デフォルトの名無しさん:04/11/11 14:46:30
>>660
知らんかった
662デフォルトの名無しさん:04/11/11 15:15:14
>>661
cout << typeid("Hello").name() << endl;
cout << typeid(L"Hello").name() << endl;
すれば一目瞭然
663デフォルトの名無しさん:04/11/11 17:01:01
ごめんなさい、>>660->>662が何の話をしてるか解かりません。
どなか解説してください。
664デフォルトの名無しさん:04/11/11 17:09:01
>>660
おねえさまはどうしてそんな話を持ち出されたのかしら。
665デフォルトの名無しさん:04/11/11 17:46:07
stringの代入演算子にrhsがwchar_tの物が定義されてないって事か?
普通だったらwstringを使おうという発想が出てきそうなものだが・・・・
666デフォルトの名無しさん:04/11/11 17:51:25
ごめん。Lはただの間違い。いつもの習慣でつけちゃった。
662は何が言いたいのかよくわかりません。

void assign_hello( std::string& str ){ str = "Hello!"; }
void assign_hello( std::string& str ){ str.assign( "Hello!" ); }

に訂正してお詫び申し上げます。
(結果が同じでも)代入目的で参照を受け取るのはイヤ。
戻り値にするべき。
667デフォルトの名無しさん:04/11/11 17:52:26
>>660
gcc3.4.2(MinGW)+STLport4.6.2

C:\mingw\string_error.cpp: In function `void assign_hello2(_STL::string&)':
C:\mingw\string_error.cpp:5: error: no matching function for call to `_STL::basic_string<char, _STL::char_traits<char>,
_STL::allocator<char> >::assign(const wchar_t[7])'
C:/STLport-4.6.2/stlport/stl/_string.h:596: note: candidates are: _STL::basic_string<_CharT, _Traits, _Alloc>&
_STL::basic_string<_CharT, _Traits, _Alloc>::assign(const _STL::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = _STL::char_traits<char>, _Alloc = _STL::allocator<char>]
C:/STLport-4.6.2/stlport/stl/_string.h:599: note: _STL::basic_string<_CharT, _Traits, _Alloc>&
_STL::basic_string<_CharT, _Traits, _Alloc>::assign(const _STL::basic_string<_CharT, _Traits, _Alloc>&, size_t, size_t) [with _CharT = char, _Traits = _STL::char_traits<char>, _Alloc = _STL::allocator<char>]
C:/STLport-4.6.2/stlport/stl/_string.h:607: note: _STL::basic_string<_CharT, _Traits, _Alloc>&
_STL::basic_string<_CharT, _Traits, _Alloc>::assign(const _CharT*, size_t)
[with _CharT = char, _Traits = _STL::char_traits<char>, _Alloc = _STL::allocator<char>]
C:/STLport-4.6.2/stlport/stl/_string.h:610: note: _STL::basic_string<_CharT, _Traits, _Alloc>&
_STL::basic_string<_CharT, _Traits, _Alloc>::assign(const _CharT*) [with _CharT = char, _Traits = _STL::char_traits<char>, _Alloc = _STL::allocator<char>]
・・・・・

以下略。
ちなみに一個目の関数はコメントアウト。
668デフォルトの名無しさん:04/11/11 17:54:35
>>666
fstreamのオブジェクトを他関数に渡す時は?
669デフォルトの名無しさん:04/11/11 17:57:04
>>666を見ても、まだ何が言いたいのかわからない私はダメ人間ですか?
670デフォルトの名無しさん:04/11/11 17:57:44
とんち?
671デフォルトの名無しさん:04/11/11 19:34:58
void append_hello( std::string& str ){ str += "Hello!"; }
はダメ
void append_hello( std::string& str ){ str.append( "Hello!" ); }
ならOK

さてな〜んだ♪
672デフォルトの名無しさん:04/11/11 22:08:26
>>666
> 662は何が言いたいのかよくわかりません。

ワラタ
673デフォルトの名無しさん:04/11/11 22:14:56
>>666
>>661-662はoperator =()にconst wchar_t *を受け取るものはないがassignにはあるんだとでも思ったんだろう。
674デフォルトの名無しさん:04/11/12 00:35:56
>>666
元々代入じゃなかった関数の中身が諸々の事情で
代入になった場合には、結果が同じでも関数の型を変更する気ですか?
675デフォルトの名無しさん:04/11/12 17:14:51
俺も何が言いたいのか分からん
エスパーいないのか?
676デフォルトの名無しさん:04/11/12 17:58:24
気分の問題なんだってさ。
operator=は特別なんだろう、彼にとって。
677デフォルトの名無しさん:04/11/12 22:25:13
std::mapのキー値をchar*型としてstrcmpと同じような比較関数を指定したいんですが、どうやって指定すればいいんですか?
678デフォルトの名無しさん:04/11/12 22:42:18
struct MyLess { bool operator < (const char *lhs, const char *rhs) const { return strcmp(lhs, rhs) < 0; } };

std::map<char *, value_type, MyLess> myMap;
679デフォルトの名無しさん:04/11/12 22:42:55
operator () の間違い。
struct MyLess { bool operator () (const char *lhs, const char *rhs) const { return strcmp(lhs, rhs) < 0; } };

std::map<char *, value_type, MyLess> myMap;
680デフォルトの名無しさん:04/11/12 22:43:16
それぐらい用意しとけよ、って思うけど、basic_string使って欲しいんだろうね。
681デフォルトの名無しさん:04/11/12 22:47:31
basic_stringのコピーのコストが馬鹿にならないときもあるからねえ。
参照のみの文字列は重複なしでプールに叩き込んどいて、ポインタだけで
処理ってのも、少なくないな。

stringにしたって、数千〜数万のオーダーにでもならない限り目に見えて
差が出ることはあまりないけどね。

682678:04/11/12 22:58:48
出来ました。
ありがとうございました。
683677=682:04/11/12 23:00:04
番号違いましたねorz
684デフォルトの名無しさん:04/11/12 23:28:26
basic_stringは参照カウンタうるからそんなにコピーのコストは低いしね
685デフォルトの名無しさん:04/11/12 23:32:46
>>684
それは何回も言うように処理系依存。Copy on Writeが標準だとでも?
686デフォルトの名無しさん:04/11/12 23:44:00
テンプレに処理系ごと実装を貼り付けるしかないのかな。
調べるの面土居けど。
687デフォルトの名無しさん:04/11/12 23:44:02
Copy on Writeって何?
ググっても詳しいのが出てこない
688デフォルトの名無しさん:04/11/12 23:47:55
オブジェクトのコピーをするとき、実体を共有するだけにしとくことで、小メモリ高速化を計る仕組み。
このままだと共有してるオブジェクトを変更すると別にコピーも変更されちゃう。
だから、変更操作しようとしたときに、そのオブジェクトの実体を(ほんとに)コピーする。

Linuxのメモリ管理とかでも使われてる枯れた手法。
689デフォルトの名無しさん:04/11/12 23:49:24
共有してるかどうかを判断するために参照カウンタを持つわけだね。
690デフォルトの名無しさん:04/11/13 20:42:37
listで以下の処理をしているのですが、
pop_back();
push_front(front());
front().update();
これをもっと効率良くする方法は無いでしょうか。
もしくは環状リストとして使う方法を知りたいです。
691デフォルトの名無しさん:04/11/13 20:46:16
>>690
その処理のどこに不満があるの?
692690:04/11/13 21:02:32
>>691
back()の領域を再利用したいんです。
693デフォルトの名無しさん:04/11/13 21:26:48
queue ?
694デフォルトの名無しさん:04/11/13 21:43:09
>>690
アロケータを書け。
695デフォルトの名無しさん:04/11/13 21:46:07
>>692 splice
696690:04/11/13 22:23:26
>>695
成る程。これで解決しそうです。
ありがとうございました。
697デフォルトの名無しさん:04/11/13 23:12:26
spliceで解決なのか?
698デフォルトの名無しさん:04/11/13 23:16:21
>>697
ほかに無いだろ。
699デフォルトの名無しさん:04/11/13 23:20:32
splice でなんか問題あるの?
700デフォルトの名無しさん:04/11/13 23:34:04
最後のを最初に移動したいだけ
701デフォルトの名無しさん:04/11/16 23:02:15
setのinsertの返り血で、pairを返したときに、
secondのbool値は何を意味するんでしょうか?
702デフォルトの名無しさん:04/11/16 23:04:59
挿入出来たかどうか
multi- では単に iterator だけが返されるようになる
703デフォルトの名無しさん:04/11/16 23:09:00
>>702
setの仕様がよく分かってないんだけど、
挿入できたかどうか、っていうのはユニークな値かどうかってこと?
704デフォルトの名無しさん:04/11/16 23:18:28
set ではキーの重複は認められないので挿入出来ないときがあるっしょ。
705デフォルトの名無しさん:04/11/16 23:22:17
大阪(西梅田)、新宿(JR駅前)のそれぞれ一等地に
拠点を構えるソフトウェア開発会社
グリーンシステムを応援するHPです。
http://www.geocities.jp/grs_hp/

こちらのスレの住人のかたがたのようなレベルの高いかたに
ピッタリだと思いますので、是非一度ご覧下さい。
706デフォルトの名無しさん:04/11/16 23:30:24
>>704
そうだったんですか。
ありがとうです。謎は全て解けました。
707デフォルトの名無しさん:04/11/18 14:33:52
hash_mapを使用していますが、件数が多くなるにつれて検索速度が落ちます。
検索を早くする方法はありませんか?
キーは文字列です。

708デフォルトの名無しさん:04/11/18 15:15:19
> 件数が多くなるにつれて検索速度が落ちます。

件数がいくら多くなっても検索速度が落ちないコンテナなんてないです。
709デフォルトの名無しさん:04/11/18 15:17:44
量子コンテナ
710デフォルトの名無しさん:04/11/18 15:55:05
強いていうならハッシュ関数が悪いと衝突が多くなって急速に性能が劣化する
711デフォルトの名無しさん:04/11/18 16:18:22
>>710
ハッシュ関数が悪くなくてもロード率が上がれば衝突が多くなる。
712デフォルトの名無しさん:04/11/18 16:43:04
衝突する率を下げるにはどうすれば?
713デフォルトの名無しさん:04/11/18 17:09:28
テーブルを大きくする。
ハッシュ関数の性能を上げる。
714デフォルトの名無しさん:04/11/18 17:35:22
gperfなら衝突しないよ
715デフォルトの名無しさん:04/11/18 23:06:28
ハッシュと赤黒併用すれば?
716デフォルトの名無しさん:04/11/19 01:03:16
VC++6で std::list<std::string> を使おうとしたら、次のようなwarningが出ました。

c:\program files\microsoft visual studio\vc98\include\xlocale(467) : warning C4786:
'std::reverse_bidirectional_iterator<std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,
std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::iterator,
std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,
std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator
<char> > *,int>' : 識別子が '255' 文字に切り捨てられました (debug 情報内)。

これはどういう意味なのでしょうか。
717デフォルトの名無しさん:04/11/19 01:04:04
VC6 は窓から投げ捨てろっていう意味
718デフォルトの名無しさん:04/11/19 01:09:48
>>716
散々ガイシュツ。もう答える気力もない。
719デフォルトの名無しさん:04/11/19 01:10:53
>>716
ヘルプ読めって、よく周りの人たちから言われない?
720デフォルトの名無しさん:04/11/19 01:13:56
>>717->>719
知らないなら、いちいち糞レスしなくていいよ (プ
721716:04/11/19 01:18:48
ググったら普通に解決したよ。
ここにいる連中はgoogle以下のクズばかりだな。

C4786は無視してよい。出さないためには
#pragma warning(disable:4786)
を書く。
722デフォルトの名無しさん:04/11/19 01:20:26
>>721
アイタタタ。開き直ってるよコイツ。
723デフォルトの名無しさん:04/11/19 01:38:22
Googleで検索すれば解決するような問題を一々質問するから煽られるわけだが。
724デフォルトの名無しさん:04/11/19 04:40:43
つーか完全には解決してない希ガス
725デフォルトの名無しさん:04/11/19 08:06:16
カスだから。
726デフォルトの名無しさん:04/11/19 10:20:25
>>724
完全な解決法も知らないくせに (・∀・)ニヤニヤ
727デフォルトの名無しさん:04/11/19 10:30:16
ゴキブリホイホイとしてしっかり機能しているな
728デフォルトの名無しさん:04/11/19 10:30:50
 
729デフォルトの名無しさん:04/11/19 20:28:15
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
730デフォルトの名無しさん:04/11/19 20:31:45
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
731デフォルトの名無しさん:04/11/19 20:32:30
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
732デフォルトの名無しさん:04/11/19 20:33:11
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
733デフォルトの名無しさん:04/11/19 20:34:01
>>729-732
std::stringstream使え。
734デフォルトの名無しさん:04/11/19 20:34:08
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
735デフォルトの名無しさん:04/11/19 20:34:32
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
736デフォルトの名無しさん:04/11/19 20:35:36
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
737デフォルトの名無しさん:04/11/19 20:36:09
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
738デフォルトの名無しさん:04/11/19 20:39:23
std::stringstream
std::istringstream
std::ostringstream
boost::lexical_cast
739デフォルトの名無しさん:04/11/19 20:40:48
すいません、便乗質問なんですけど、

std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
740デフォルトの名無しさん:04/11/19 20:43:25
すいません、似たような質問なんですけど、

std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
741デフォルトの名無しさん:04/11/19 20:46:37
atoi(s.c_str());
742デフォルトの名無しさん:04/11/19 20:50:25
>>741
すいません、sが定義されていないって出たんですけど、
もう少し詳しく教えていただけませんか?

ところで、もう一つ質問なんですけど、

std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
743デフォルトの名無しさん:04/11/19 20:52:11
ググったら普通に解決したよ。
ここにいる連中はgoogle以下のクズばかりだな。
744デフォルトの名無しさん:04/11/19 21:16:29
一人で貼ってたならマジうける(w
745デフォルトの名無しさん:04/11/19 21:19:36
むかつくー

でも、問題があるんですけど、

std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
746デフォルトの名無しさん:04/11/19 21:49:05
>738をご利用ください
747デフォルトの名無しさん:04/11/19 23:04:40
うわぁツマンネ 何コレ
748デフォルトの名無しさん:04/11/19 23:11:29
もともと>>1が勝手に立てたただの糞スレですから
749デフォルトの名無しさん:04/11/19 23:33:31
重複スレなのによくこんなにのびたなあ。
削除依頼も出なかったとは。
750デフォルトの名無しさん:04/11/19 23:56:12
まんこ攻撃しちゃおっかな
751デフォルトの名無しさん:04/11/19 23:56:58
まんこ
752デフォルトの名無しさん:04/11/20 01:59:56
お前ら何なの<(`д´<
753デフォルトの名無しさん:04/11/20 06:29:55
携帯からなので過去ログが読めません。既出だったらすみません。

std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
754デフォルトの名無しさん:04/11/20 07:00:12
>>753
std::stringstream
755デフォルトの名無しさん:04/11/20 09:21:32
あまんこ
756デフォルトの名無しさん:04/11/20 10:11:53
振り出しに戻った?
というわけで改めて。

std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか?
itoaとか使わなければならないんでしょうか。
757デフォルトの名無しさん:04/11/20 11:43:06
>738をご利用ください
758デフォルトの名無しさん:04/11/20 11:51:10
まんこ
759デフォルトの名無しさん:04/11/20 11:53:02
>>756
int a;
std::stringstream s;

a = 10;
s << a;
std::printf("%s\n", s.str());
760デフォルトの名無しさん:04/11/20 11:58:57
>>759
なぜstringstreamまで使っておきながらprintfなのかと子一時(ry
761デフォルトの名無しさん:04/11/20 12:17:07
stringのイテレータをconst char*に変換できません。
たとえば次のようなソースはエラーになってしまいます。

string str="hoge";
char ch[100];
string::iterator it=str.begin();
sscanf(it,"%s",ch); <-ここがエラー

キャストで(const char*)itなどとやってもだめです。
解決方法を教えてください。
762デフォルトの名無しさん:04/11/20 12:26:47
str.c_str() + std::distance(str.begin(), it)
763デフォルトの名無しさん:04/11/20 12:26:51
iteratorはポインタで実装されているとは限りません。ポインタで
実装されているかは処理系定義です。まともな実装ほど、クラスで
実装されているように思いますが。
std::basic_string<>にはc_str()という関数があるのを知っていますか?
764デフォルトの名無しさん:04/11/20 12:32:28
>>760
%sって書きたかったから。
765761:04/11/20 13:09:15
c_str()の存在は知っています。
ただ、このポインタが指すchar配列の寿命がどれくらいか分からないので
困っているのです。
たとえばスクリプトの解読をする場合にも使っていいのでしょうか。
この場合、プログラムの最初の方でc_str()でポインタを取得し、
その後このポインタを進めていくことになるのですが。
766デフォルトの名無しさん:04/11/20 13:12:02
>>765
心配ならc_str()から他のnewして確保した領域にコピーしとけ。
767761:04/11/20 13:19:34
そうですね。Cの関数を使う時は、Cで用意されているものだけ使った方がいいのかもしれませんね。
一応、itの代わりに、&(*it)でコンパイルは通り、ちゃんと動いてはいるようなのですが、
このような使い方がよいのかどうか不安です。
768デフォルトの名無しさん:04/11/20 13:21:29
>>767
だからイテレータをそういう用途に使うなと小一時間
769デフォルトの名無しさん:04/11/20 13:30:22
なんでスクリプトの解釈にイテレータを使わない?
ポインタにしないと速度が遅いからか?
それなら初めからstd::stringを使わない方がいい。筋違いだよ。
770761:04/11/20 13:38:08
sscanfを使いたいんですよ。スクリプトの解読にはこの関数が一番使いやすいんです。
ただ文字列はほとんどstd::stringで管理しているので、
この組み合わせができないかと思っていたんです。
C++にsscanfのような機能があればいいんですが。
ともかくもう結構です。>>766の方法でやります。
771デフォルトの名無しさん:04/11/20 13:40:13
まぁ、どんな方法でも構わないけど。
boost::lexical_castでも似たようなことできるのに。
772デフォルトの名無しさん:04/11/20 13:53:14
boost::regexでも使った方が幸せになれるのに。
773デフォルトの名無しさん:04/11/20 13:56:00
>>770
> sscanfを使いたいんですよ。スクリプトの解読にはこの関数が一番使いやすいんです。

ネタかよ…
あんな糞関数を…
774デフォルトの名無しさん:04/11/20 14:00:31
>>770みたいのがいるからいつまでたってもscanf()の脆弱性をついたアタッカーが
のさばる羽目になるんだ。
775デフォルトの名無しさん:04/11/20 14:00:52
boostはstlではない。標準ではない。必ず使えるものではない。
776デフォルトの名無しさん:04/11/20 14:01:47
一応まじめに注意点を。&(*it)で得られるポインタは使い物になるとは限らない。
なぜならば、以下の保証がないから。

・std::basic_string<>の内部で、連続した単一のバッファ上にデータを保持している保証
・終端が'\0'で終わる文字列である保証
・終端以外の文字に'\0'が入っていない保証
777デフォルトの名無しさん:04/11/20 14:10:54
>>775
開発者がインストールすれば使えるじゃないか。
そしてユーザはBOOSTをインストールしなくても良い。
778デフォルトの名無しさん:04/11/20 14:16:19
はぁ?BOOSTもランタイムライブラリ必要だぞ。
779デフォルトの名無しさん:04/11/20 14:39:01
>>777は知ったか
780デフォルトの名無しさん:04/11/20 14:55:40
static linkすればええやん
STL素敵やん
781デフォルトの名無しさん:04/11/20 14:57:14
>>777-779は知ったか
782デフォルトの名無しさん:04/11/20 15:57:30
boost1.32.0 releaseキタ
スレ違いスマソ
783デフォルトの名無しさん:04/11/20 21:18:36
自分で分かってるなら書くなよ
784≠770:04/11/20 22:09:55
>>774
sscanf()を使うことと、scanf()の脆弱性を付いたアタッカーがのさばることの因果関係は?
785デフォルトの名無しさん:04/11/20 22:12:00
みなさん VC6 で STL を使うときって、
Dinkumware のバグ修正を手でやってます?
何か一発修正してくれるツールとかありませんか?
786デフォルトの名無しさん:04/11/20 22:12:59
stlportを入れる
787デフォルトの名無しさん:04/11/20 22:18:54
>>786
STLport は VC6 と相性いいですか?
使いやすいですか?
788デフォルトの名無しさん:04/11/20 22:20:47
VC付属より200倍は使いやすい
789デフォルトの名無しさん:04/11/20 22:22:08
そうですか、ありがとう。使ってみることにする。
VC7.1 の STL と比べてどうでしょうか?
790デフォルトの名無しさん:04/11/21 11:07:31
とても締まりがいいです
791デフォルトの名無しさん:04/11/21 11:32:32
>>790
ヤラシイナオマエ
792deque:04/11/21 11:40:04
前から (゚Д゚) 後ろから!
793デフォルトの名無しさん:04/11/22 04:52:28
○ャノン勤務?(w
794デフォルトの名無しさん:04/11/22 10:14:51
795デフォルトの名無しさん:04/11/22 14:11:07
>>793
その会社なら○ヤノンじゃないのか?
796デフォルトの名無しさん:04/11/22 17:47:05
そうだな
お手洗いだったか
797デフォルトの名無しさん:04/11/22 17:53:20
この会社って○ャノンって言うと怒るんだよな
798デフォルトの名無しさん:04/11/22 19:47:06
ここはキ○ノンと呼べば丸く収まる予感。
ただ俺にはキセノンに見えてしまうという罠。
799デフォルトの名無しさん:04/11/23 16:10:29

だれか次のようなプロトタイプを持つ、
stringの前後にある空白文字を除去するプログラムを作ってください。
お願いします。

std::string trim(std::string str)
{
    /*ここに空白除去のコードを書く*/
    return str;
}

800デフォルトの名無しさん:04/11/23 16:11:30
空白文字は、スペース、タブ、復帰改行です。
801デフォルトの名無しさん:04/11/23 16:32:53
車輪の再発明をするよりは、
素直にboostのstring algorithmにあるtrimを使う方がいいんじゃないかと…
STLスレなんだけどな('A`)
802デフォルトの名無しさん:04/11/23 16:33:45
std::string trim (const std::string& src, const std::string& space = " \t\r\n")
{
    std::string::size_type b = src.find_first_not_of(space);
    return src.substr(b, src.find_last_not_of(space) - b);
}

最発明ってほどのことでもないだろ
803デフォルトの名無しさん:04/11/23 16:46:35
>>802
spaceはconst char *でもいいんじゃないか?
804デフォルトの名無しさん:04/11/23 16:48:47
>>802
find_last_not_of の戻り値って、引数に含まれる文字を指すの?
そうじゃないと、1文字減っちゃうよね?
805デフォルトの名無しさん:04/11/23 16:54:27
>>803
const char*からconst std::string&への暗黙の変換はあるが逆はないからこういう場合はconst char*よりconst std::string&のほうが潰しが効く。

>>804
+1してないから喰われてるな、たしかに。
806デフォルトの名無しさん:04/11/23 17:01:36
配列Tを
T[N][N]としたんですが このようなエラーメッセージがでました。

declaration of `T' as multidimensional array must have
bounds for all dimensions except the first

これってなんですか?教えてください。
807デフォルトの名無しさん:04/11/23 17:10:55
>>464
実装による。
808デフォルトの名無しさん:04/11/23 17:11:37
>>801
それならCString::TrimLeft()を使うのもありだな
809デフォルトの名無しさん:04/11/23 17:16:27
>>806 スレ違い。ソース持ってCスレ逝け。
810デフォルトの名無しさん:04/11/23 17:24:09
>>654
歌を作った人は、べつにビスケットが割れることによって数量が増えるということを
意図したわけではありませんよ?
811デフォルトの名無しさん:04/11/23 17:44:55
>>810も含めて、突っ込みどころが多いわけだ。
812デフォルトの名無しさん:04/11/23 17:45:41
>>808
CStringのソースを参照するというなら兎も角、そのまま使うというならスレ違いだな。
813デフォルトの名無しさん:04/11/23 18:03:05
>>812
流れを嫁
814デフォルトの名無しさん:04/11/23 20:47:38
潰しが効くってどういう意味?
815デフォルトの名無しさん:04/11/23 20:54:26
>>814
いろいろ応用できるってことだよー にゃんにゃん
816デフォルトの名無しさん:04/11/24 01:20:37
>>815
最近良く見るその語尾のにゃんにゃんっての元ネタ何?
817デフォルトの名無しさん:04/11/24 02:17:01
>>802
連続したスペースなどだったら使えないな〜
818デフォルトの名無しさん:04/11/24 02:19:19
使えるだろ
819デフォルトの名無しさん:04/11/24 02:19:51
>>816
ホワッツマイケル
820デフォルトの名無しさん:04/11/24 03:04:22
>>818
817と同じ意味かどうかは知らんが、
src内にスペース以外の文字が一つも含まれていなければ失敗するね。
821デフォルトの名無しさん:04/11/24 14:23:10
int val;
std::list<int> vallist;
val=*vallist.end();

この時valには何が入るんですか?
822デフォルトの名無しさん:04/11/24 14:36:09
>>821
動作そのものが未定義
823デフォルトの名無しさん:04/11/24 14:57:32
じゃあなんでコンパイルが通るんだよ
824デフォルトの名無しさん:04/11/24 15:00:06
>>823
そりゃ、未定義だもん。どうなったって規格上OK。
ダメって定義されてるならコンパイル通らないだろうけどさ。
(そもそも静的にはチェックできないが。)
825デフォルトの名無しさん:04/11/24 15:18:59
>>823
君が言っている事は

int a[10], i;
i = a[10];

でコンパイルが通るな、と言っているのと意味的にほとんど変わらん。
826デフォルトの名無しさん:04/11/24 16:00:36
未定義の定義がはっきりしてないな。
まあ答えは"intと同じサイズのゴミ"なわけだが。(俺の環境では)
827デフォルトの名無しさん:04/11/24 16:05:06
>>826
実装系依存
828821:04/11/24 16:14:46
俺が聞きたかったのは、つまり次のような関数の返値でエラー判定を行うには
どうしたらいいのかということだ。でも簡単にするために>>821みたいに書いたんだよ。

struct Hoge{
  int value;
};
list<Hoge> hogelist;
Hoge Find(int x){
  list<Hoge>::iterator it;
  for(it=hogelist.begin(); it!=hogelist.end(); it++){
    if((*it).value==x) return *it;
  }
  return *it; //この時点でit==hogelist.end()である
}
829821:04/11/24 16:19:52
分かると思いますが、Find(int x)は、クラスHogeのリストの中から
最初にvalueがxと一致した要素を返すものです。
もし一致する要素がなければ、エラーということにしたいのですが、
この時何を返してたらいいのかが分からないのです。
エラー判定用の引数をつけるという方法もありますが、あまりスマートではないので。
830デフォルトの名無しさん:04/11/24 16:21:18
>>828
なぜfind_ifを使わない
831デフォルトの名無しさん:04/11/24 16:22:19
Hoge型を返すんじゃ無理だな。
list<Hoge>::iteratorを返すようにすればFind(foo) == hogelist.end()で比較できる。
ってこれじゃ830の言う通りfind_if()で代用できるじゃないか。
832デフォルトの名無しさん:04/11/24 16:22:59
例外投げて呼び出し側でcatchするとか
833821:04/11/24 16:27:30
ありがとう。find_if()を調べてみるよ。
834デフォルトの名無しさん:04/11/24 16:33:07
>>828
がんばれよ。
でも今後は、丁寧に質問しような。
835デフォルトの名無しさん:04/11/24 16:59:21
STLPortのデバッグモードで叩き落せ!
836山田:04/11/24 17:02:31

StreamReaderを使用してファイルを読み込む処理を行っています。

----------------------------------------------------
StreamReader sr = new StreamReader( "test.txt", System.Text.Encoding.GetEncoding( "SHIFT-JIS" ));
string input;
string sql;
while(( input = sr.ReadLine()) != null )
{
sql += input + "\r\n";
}
sr.Close();

---------------------------------------------------

1回目の呼び出しは、正常に行われるのですが、2回目以降呼び出すと
「プロセスはファイル "***" にアクセスできません。このファイルは別のプロセスが使用中です。」
というエラーメッセージが表示されます。
※読み込み対象ファイルは、1回目と2回目以降、異なります。

ストリームをクローズしているのに?どうしてこのようなエラーが・・・。
ご存じの方、いらっしゃいましたら、ご教授願います。
837デフォルトの名無しさん:04/11/24 17:07:13
C#スレに帰れ
838デフォルトの名無しさん:04/11/24 17:13:05
ストリームのクローズとファイルのクローズは違う。
・・・とかC#なんて見たこともないのに言ってみる。
839デフォルトの名無しさん:04/11/24 19:59:45
821って中学生?
840デフォルトの名無しさん:04/11/24 23:50:47
>>839
最近良く見るその中学生?っての元ネタ何?
841デフォルトの名無しさん:04/11/24 23:59:21
>>840
厨房
842デフォルトの名無しさん:04/11/25 00:12:04
ふつーにつかわないかね?
843デフォルトの名無しさん:04/11/25 08:17:22
普通に使うよね。
最近生まれた言い回しでもないし、そんなによく見るわけでもない。
844デフォルトの名無しさん:04/11/25 21:45:27
auto_ptr って使ってますぅ?
なんとなく使うの怖くないですか?
845デフォルトの名無しさん:04/11/25 21:50:04
std::auto_ptr<>もboost::shared_ptr<>も使えないほうが怖すぎ。
846デフォルトの名無しさん:04/11/25 22:04:38
new []をauto_ptrに突っ込むことほど怖い物はない。
847デフォルトの名無しさん:04/11/25 22:06:36
deleteしたポインタを使うよりはマシ
848デフォルトの名無しさん:04/11/25 22:48:41
vector に new した構造体のポインタを入れておいて、
後で列挙して delete する、っていうような作業がよく発生するんですけど、
こういうのを自動化してくれるモノはないんでしょうか。
849デフォルトの名無しさん:04/11/25 22:49:32
スマートポインタとvectorを組み合わせて使う
850デフォルトの名無しさん:04/11/25 23:17:22
>>848
そういうvectorの派生クラスでも自作する
851デフォルトの名無しさん:04/11/25 23:20:38
>>850
こんなのでいい?

template<typename T>
class auto_vector : public vector<T> {
  ~auto_vector(void) {
    // ここで delete
  }
};
852デフォルトの名無しさん:04/11/26 00:15:57
>>851
vector<hoge>* ptr = new auto_vector<hoge>;

delete ptr; // あぼーん
853デフォルトの名無しさん:04/11/26 00:34:48
>>852 ( ´_ゝ`)フーン
854デフォルトの名無しさん:04/11/26 02:35:24
reference counting
855デフォルトの名無しさん:04/11/26 02:38:27
referrence
856デフォルトの名無しさん:04/11/26 02:40:27
といった間違いをしないように。

(例) HTTP_REFERRER
857デフォルトの名無しさん:04/11/27 04:45:33
#include <iostream>
#include<list>
using namespace std;
void disp( list<int>& lst ){
list<int>::iterator itr = lst.begin();
list<int>::iterator itrEnd = lst.end();
for( ; itr != lst.end() ; itr++ )
cout << *itr << " ";
cout << endl;
}
int main(int argc, char* argv[]){
list<int> lst1, lst2, lst3, lst4;
int i, n;
for( i = 0 ; i < 5 ; i++ ){
// listなので、push_frontが使える
lst1.push_front( i );
}
cout << "list1 ";
disp( lst1 );
cout << endl;
list<int>::iterator itr2 = lst1.begin();
lst1.erase(itr2);
cout << "list1 ";
disp( lst1 );
cout << endl;
return 0;
}
で、list1の3番目の要素を表示するにはどうすればよいのでしょうか?
858デフォルトの名無しさん:04/11/27 04:50:52
>>857
質問の意味がよくわかりません
list1 4 3 2 1 0

list1 3 2 1 0

と出ますがどういうことしたいのですか?
859デフォルトの名無しさん:04/11/27 04:53:39
>>858
わかりにくくてすいません
いまlistの勉強をしてまして
list1の一番初めの要素を削除する実験をやってたんです

list1の3番目の要素を削除する方法も知りたいです
860デフォルトの名無しさん:04/11/27 05:00:54
>>859
beginでとったイテレータを3回インクリメントするか
std::advance
861860:04/11/27 05:01:37
2回の間違いね
862デフォルトの名無しさん:04/11/27 05:15:15
>>860
ありがとうございました
できました
863デフォルトの名無しさん:04/11/27 14:12:18
lisper?
864デフォルトの名無しさん:04/11/27 14:24:03
イアーウィスパー
865デフォルトの名無しさん:04/11/28 01:34:08
以下のプログラムは、
1
2
Construct
Destruct
3
4
Destruct
という結果になるのですが、STLに自動変数オブジェクトを突っ込むと
どういう解釈が行われるのでしょうか? 識者の方教えてください。

#include <iostream>
#include <list>
using namespace std;
class T {
public:
T(){ cout << "Construct" << endl; }
~T() { cout << "Destruct" << endl; }
};
int main()
{
list<T> l;
cout << "1" << endl;
{
cout << "2" << endl;
l.push_back(T());
cout << "3" << endl;
}
cout << "4" << endl;
return 0;
}
866デフォルトの名無しさん:04/11/28 01:42:14
>>865です。

T(const T &t){ cout << "Copy Construct" << endl; }
というコピーコンストラクタを作成してみたところ、
1
2
Construct
Copy Construct
Destruct
3
4
Destruct
という結果になりました。コピーコンストラクトされているのかな。
もうちょっと本を読んでみます。
867デフォルトの名無しさん:04/11/28 01:44:09
何故こんな事すら知らない香具師が STL 使ってるのかが激しく疑問だ
868デフォルトの名無しさん:04/11/28 01:48:57
>>867
セコイ奴
869デフォルトの名無しさん:04/11/28 01:49:13
>>867
あなただって最初は何も知らなかったでしょう。
無知をバカにする姿勢はよろしくない。
870デフォルトの名無しさん:04/11/28 01:49:53
そうだそうだ
871デフォルトの名無しさん:04/11/28 01:51:07
くりーむそーだ
872デフォルトの名無しさん:04/11/28 01:51:26
>>865です。

Effective STLの第3項に該当情報がありました。
コピーされるのですね。んで、ポインタのコンテナにするよりも、
スマートポイントのコンテナにした方が良いということがわかりました。

>>867
ごめんなさい。
873デフォルトの名無しさん:04/11/28 01:57:43
>>872
余計なお世話かもしれないが、auto_ptrはだめだぞ。
EffectiveSTL読んでるんだったらわかると思うが。

しかしboost::shared_ptrにstd::mem_fun適用しようとすると怒られるな。
素直にboost::mem_fn使えって事か。boostのいくつかが早く標準化
するまではこうしたゴタゴタを承知の上で使って行かなければならんなー
874デフォルトの名無しさん:04/11/28 02:03:52
auto_ptrを無条件にダメという奴はgotoを無条件にダメと言ってる奴と大差ない
875デフォルトの名無しさん:04/11/28 02:24:33
そうだそうだ。お兄ちゃんに謝れ。
876デフォルトの名無しさん:04/11/28 02:35:20
>>874
アルゴリズムでコンテナの中身をいじくる奴を動かすと大変な事になるだろが。
それに、COAPがそもそもコンパイルを通さない場合もあるし。
知ったか君は帰っていいよ。
877デフォルトの名無しさん:04/11/28 02:37:09
>>875

   |    ,.ゝ─-,.r'´ ̄ `丶、       |  猫だよ
    ヽ,.r'"   ,. / ヽ `ヽ--─ '"フ     |
   /  ,.' /  il i ヽ 丶   ,.イ    |   ニャン ニャン
 ,.イ/  /i /l   !| l   ヽ l,..ノ,. 'i    |
  /ィ / /-ノ、l  ハ ! ! : l i/j l |    ノノ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ! l/ ,ir‐‐、 iヽl -ヽl、 l !│ / ,' !
   )r'! i l;;ソ   ‐r‐、,ソ,.j / / /,ィ      ,. -‐- 、
  '´ l |  '     j.:.::ゞj /、 / // i     / ,. -、 ヽ
    l lヽ  l>  `'‐'"//ッノ ! ハ! `   /  , '   ヽ ゙!
   ,.-l 、ゝ、 __ ,.  ‐'フ,' ミ,.| j |     ,'  /    j  l
  /  ` シ;.    "'ツ'´  ,シヽ' `'    |  l    ノ! ,.ヘ
  !   ,.ゞヘ;.j、ハ.r;.iゞ'ミ'゙   `丶、   l  '、    '"'´
  l l / /  ヽ   ヽ      ヽ   ヽ 丶
  ヽ,i'  , '   > '´ ヽ   ヽ、     j    ヽ、 ヽ
  /  '、 ,.'   ,ノ   リ     ,ヘ、    ヽ ヽ
  !   ヽj  ,. '"      !    l  ヽ、. --、._ j  !
  丶   `'´       ノ‐--- '!        〉i`ヾ、
    ヽ...,, -- 、..    ,. '"|     j      / ,'   ヽ
     ト、 ヽi ゙;,,.シ ̄;ゞ  l    ,'l     ,.' ノ-'"  丶
    〉、  l `''"^'''"´ ̄|     l、..__,. -' =‐- 、.._   i
     | 丶. !   ,. ‐ ' ´l   、l,. - ‐ '" ̄ `丶、 ` |
     |   l ,. '´    l     !             ヽ j
    !  /      ,. !   │          /
    l. , '         /  l     l             ,.'
     ,!'       /    l    |           /
   /        , '      l   |     ,. ‐'´
   !      /         !,.=ゝ_,. -‐' ´
   !     ,'        ,j    ヽ‐ 、"""''' ─-- ....
   丶、    l      イl l   、ヽ丶,j
     ` ‐- ' ヽ      j ! j /^ヽヽヽl
878デフォルトの名無しさん:04/11/28 02:37:11
だいたい標準C++はauto_ptrをコンテナに入れる事自体を禁止している。
auto_ptrはリソース・リーク対策だけに限定して使うべきだ。
879デフォルトの名無しさん:04/11/28 02:37:21
STLコンテナの要素にauto_ptr使うのは無条件にダメだろ。
880デフォルトの名無しさん:04/11/28 02:40:17
>>874は厚顔無恥
881デフォルトの名無しさん:04/11/28 09:34:39
>>874はgotoは無条件に駄目な人なんじゃないか? (w
882デフォルトの名無しさん:04/11/28 10:33:07
>>880 >>881
auto_ptrの使い方を知らないバカ
>>876 >>878
だからそうだと言っている。
883デフォルトの名無しさん:04/11/28 11:19:41
vectorは普通の配列のようにhoge[4]って感じで5番目の中身を参照できるようですが、
setは[]使えないんですか?
iterator使うしかなんでしょうか。
884デフォルトの名無しさん:04/11/28 11:23:56
2行目、分かり難くなりましたが、
setの場合はhoge[n]のように要素番号を指定できないのでしょうか?ということです。
例えばforループのなかで中身を取り出すだけで
わざわざiteratorを用意するのは面倒くさいなと思いまして。。。
885デフォルトの名無しさん:04/11/28 12:07:37
>>883
>setは[]使えないんですか?
>iterator使うしかなんでしょうか。
はい
ただライブラリはそののまま使わなくてもいいのですよ
もし必要なら
template <typename T>
class set: private set <T>
{
public:
typedef set <T>::value_type value_type;
value_type &operator [] (size_t p);
};
とでもしてoperator []を実装するのは自由です
886885:04/11/28 12:08:43
class名setは変えたが良いかも
887デフォルトの名無しさん:04/11/28 12:10:06
>>884
>わざわざiteratorを用意するのは面倒くさいなと思いまして。。。
ちなみにこの理由でiteratorを使わないのはどうかと思いますよ
888デフォルトの名無しさん:04/11/28 12:12:09
setにはoperator[]はないので無理です。
それはそうとみんなsetとmapどう使い分けてるんだろう・・・
889デフォルトの名無しさん:04/11/28 13:17:07
(;´Д`)エー
890デフォルトの名無しさん:04/11/28 13:29:15
それはそうとみんな箸と茶碗をどう使い分けてるんだろう・・・
891デフォルトの名無しさん:04/11/28 13:31:05
箸:叩く
茶碗:叩かれる

(・∀・ )っ/凵 ⌒☆チン
892デフォルトの名無しさん:04/11/28 13:33:47
それはそうとみんなぬるぽとガッをどう使い分けてるんだろう・・・
893デフォルトの名無しさん:04/11/28 15:05:16
それはそうとC++とRubyをどう使い分けてんだろう
894デフォルトの名無しさん:04/11/28 15:07:54
使い分けるも何も、C++とperlぐらいしか使える言語がありません_| ̄|○
895デフォルトの名無しさん:04/11/28 15:11:36
(自宅では)適材適所で、
C++, awk, sed, csh, sh, JavaScript
を使い分けてます。
896デフォルトの名無しさん:04/11/28 17:35:16
>>885
継承しなくてもグローバルにtemplate<typename T> operator [](std::set<T> Set, std::size_t n)ってできなかったっけ?
これができるんだったらtemplate<typename T> operator [](T Container, std::size_t n)にした方がいいような。
897デフォルトの名無しさん:04/11/28 17:56:31
>>896
言いたかったのは
>ただライブラリはそののまま使わなくてもいいのですよ
です
継承はまぁ例です
ちなみにグローバルにoperator []は定義できませんよ
898デフォルトの名無しさん:04/11/28 18:32:26
Ruby以外の言語はkぜうんぶくそ!
899デフォルトの名無しさん:04/11/28 18:35:17
るびぃいいいいいいいいいいいいいいいいいいいいいいいい
900デフォルトの名無しさん:04/11/28 19:27:13
#include <iterator>してadvance()使え。
901883:04/11/29 11:08:56
遅くなってすいません。
参考になりました。ひとまずiterator使うのに慣れるようにします。
ありがとうございました。
902デフォルトの名無しさん:04/11/29 12:03:43
そろそろ1000とりはじめるか
903デフォルトの名無しさん:04/11/29 12:12:50
この早漏めがっ!!
904デフォルトの名無しさん:04/12/01 00:43:40
STLの ofstreamで クラスオブジェクトを丸ごとバイナリファイルに保存したいんですが、
そのクラスにvectorのメンバ変数が存在します。

このままだと普通に保存できないんですが、どうしたらいいんでしょうか?
このvector変数はprivateになってます。
905デフォルトの名無しさん:04/12/01 01:11:23
>>904
シリアライズ/デシリアライズ処理を自分で書く
906デフォルトの名無しさん:04/12/01 01:44:29
>>905 ありがとうございました
907デフォルトの名無しさん:04/12/01 19:55:14
次の方どうぞ
908お願いします:04/12/01 21:21:26
どなたか↓これに答えてあげてください。。。
http://pc5.2ch.net/test/read.cgi/tech/1101473340/86
909デフォルトの名無しさん:04/12/01 21:45:36
>>908
本当に
int& c = counter[*it];
で落ちてるの?
if (counter.find(*it) == counter.end()) {
counter.insert(ValueCounter::value_type(*it, 0));
}
いれて動くからといって原因がここだとは限らないよ

ちなみにg++では正常に動いているように見える
910908:04/12/01 22:52:49
>>909
ええ、たしかにそこで落ちました。
詳しくいいますと、map.insert() の実装のツリーの中で落ちました。

以前は元のままでも VC6 で動作したのですが、
プログラムを複雑にしているうちに、
そこでエラーが発生したんです。
VC6 のバグではないかなとも思うのですが。。
911デフォルトの名無しさん:04/12/01 22:59:55
処理系のバグと自分のバグと…
確率ととしては(以下省略いたします
912デフォルトの名無しさん:04/12/01 23:05:39
VC6+STL → OTL
913デフォルトの名無しさん:04/12/01 23:24:49
>>912
OTL ってなんですか?
914デフォルトの名無しさん:04/12/01 23:32:24
OTLと書いて「窓から投げ捨てろ」と読む。
915デフォルトの名無しさん:04/12/01 23:33:38
なんお略語ですか?
916デフォルトの名無しさん:04/12/01 23:36:24
Old fart Template Library
917デフォルトの名無しさん:04/12/01 23:41:04
>>913
O=頭
T=腕
L=足

顔文字というか体文字?
918デフォルトの名無しさん:04/12/01 23:43:37
普通にtrueが出力されるがなぁ。

template<typename Cont>
typename Cont::value_type ModeAverage(const Cont& cont)
{
  typedef std::map<typename Cont::value_type, int> ValueCounter;
  ValueCounter counter;

  int maxFreq(0);
  for (typename Cont::const_iterator it = cont.begin(); it != cont.end(); ++it)
    maxFreq = std::max(maxFreq, ++counter[*it]);

  typename Cont::value_type sum(0);
  int sumCount = 0;
  for (typename ValueCounter::const_iterator it = counter.begin(); it != counter.end(); ++it)
    if (it->second == maxFreq)
    {
      sum += it->first;
      ++sumCount;
    }

  return sum / sumCount;
}

int main()
{
  double data[] = {2.0, 1.0, 2.0, 5.0, 3.0, 4.0, 5.0, 2.0, 5.0, 4.0};
  std::vector<double> v(data, data + sizeof(data) / sizeof(data[0]));
  std::cout << std::boolalpha << (ModeAverage(v) == (2.0 + 5.0) / 2) << std::endl;
}
919デフォルトの名無しさん:04/12/01 23:43:45
kuzuOre Template Library
920デフォルトの名無しさん:04/12/02 19:43:39
vectorの代入で質問があります。

vector<MyClass*> v1, v2;
v1 = v2;
はコンパイルを通るのですが

vector<const MyClass*> v1;
vector<MyClass*> v2;
v1 = v2;
だとコンパイルを通りません。

もちろんassignメソッドなどを使ってコピーするなりすれば値のコピーはできるのですが
それだと関数の引数がconstになっている場合などはconstの一時変数を作ってコピーを
行った後でその変数を引数として渡すというような処理が必要になります。

上記のような場合やdoubleのvectorにintのvectorを代入したいといった場合は
どのような処理をするのが望ましいのでしょうか?
921デフォルトの名無しさん:04/12/02 19:55:58
for文でインデックスを回しながら代入していくのがいいんじゃない?
922920:04/12/02 20:14:00
>>921
説明不足ですみません。

vector<MyClass*> vec;
MyClass *obj = new MyClass();
vec.push_back( obj );
のようになっているとして、上記の変数vecを

void func(const vector<const MyClass*> &);
のような内部でvectorの要素のオブジェクトの変更を行わない関数の引数として

func( vec );
のように使用するとコンパイルができない。
という趣旨の質問です。

923デフォルトの名無しさん:04/12/02 20:28:56
そりゃあなた、vector<const MyClass*>とvector<MyClass*>は
まったく違う型だから、代入とかコピーとかできませんよ。

別の型が格納されたコンテナ間のコピーをするための
テンプレート関数でも書けばどう?
924デフォルトの名無しさん:04/12/02 20:31:36
>>922
正攻法 func(vector<const MyClass*>(vec.begin(), vec.end()));
キャストfunc(reinterpret_cast<vector<const MyClass*>&>(vec));
何度もやるのならこういうことするinline関数を書けば良いさ。
925920:04/12/02 21:01:30
>>923
なるほど。違う型の扱いになるんですか。
const char*にchar*が代入できるのと同じ感覚で代入できるのかと思ってました。
勉強になりました。

>>924
これだと一時変数を作ったりしないで望んだ動作ができそうです。
アドバイスありがとうございました。
926デフォルトの名無しさん:04/12/04 00:22:47
double* data は数値データの配列とします。
この中から最大値を求めるには STL 的にスマートに書くとどうなるでしょうか?
data に格納されているサイズは int data_size としてあらかじめ分かっています。
よろしくお願いします。
927デフォルトの名無しさん:04/12/04 00:27:14
max_element
928デフォルトの名無しさん:04/12/04 00:27:56
std::max_element(data, data+data_size);
929デフォルトの名無しさん:04/12/04 00:30:23
>>927 >>928
すいません、有難うございます。
data を含むコンテナを生成して、そこからイテレータを作らないといけないのかな、
と思っていたのですが、ポインタはそのままイテレータとして使えるのですね。
930デフォルトの名無しさん:04/12/16 22:31:55
質問です。
stlのstringを使っているのですが
まだ、使い慣れなくて
標準関数のstrstrとかstrcmpとか
色々と標準関数と合わせての使用が多くなっているのですが、
stringの仕様がよくわからないもので値を受け取るときなど
いちいち

char temp[256];
memset(temp,0,sizeof(temp));
strncat(temp,(char*)temp_str.c_str(),5);
string dir = temp;

とかやっております。
なにか文字列関数を使うたびにこんなことやっておりますが
実際はどう使ったらいいものなのでしょうか?
931デフォルトの名無しさん:04/12/16 22:44:26
substr
operator=
932デフォルトの名無しさん:04/12/16 22:44:53
>>930
C++標準ライブラリ、チュートリアル&リファレンス
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/249-9185395-5013104
をお勧めする。
但し現在は品切れ中だそうだが。こんないい本は早く増刷して欲しい。
933デフォルトの名無しさん:04/12/16 22:45:18
std::stringはSTLじゃない。
とっととstd::stringの使い方を覚えろ。
934デフォルトの名無しさん:04/12/16 22:48:00
>>930
一文が長すぎる。しかも、「が」が多すぎる。文章は短くなるように心がけた方が伝わりやすい。
それはさておき、memset()してからstrncat()なんてダメすぎ。
256なんてマジックナンバーが出てくる辺りもどうしようもない。
C++使いならせめて、このくらいは書けないと。
char * temp = new char[temp_str.size()];
strcpy(temp, const_cast<char *>(temp_str.c_str()));
string dir = temp;
delete[] temp;

#あ、この場合5文字で制限するのが目的ならこれでもいいか。
char temp[6];
sprintf(temp, "%.5s", temp_str.c_str());
string dir = temp;
935デフォルトの名無しさん:04/12/16 22:48:53
>>C++使いならせめて

( ´,_ゝ`)プッ。噴いたじゃねーか。
936デフォルトの名無しさん:04/12/16 22:51:24
>>934
…std::basic_string<>::copy()は何のためにあるのかと。
937デフォルトの名無しさん:04/12/16 23:02:35
みなさん色々とアドバイスありがとうございます。

とりあえずですね、
文字列を受け取るのに
一旦、char temp[256]とかにうつしてからstring dirに格納するという
動作がかなりバグの元になっているのでなんとかしたいのですが
どうにかならないものでしょうか?
できればプログラムからchar型での文字列の扱いを無くしたいと考えております。
938デフォルトの名無しさん:04/12/16 23:12:52
temp_strっていうstringから最初の5文字をdirに移せば良いんですか?

dir.assign(temp_str.begin(), temp_str.begin() + 5);

こういうことですか?
939デフォルトの名無しさん:04/12/16 23:29:10
とりあえずな、ググれば日本語のリファレンスぐらい出てくるわけよ。
http://www.wakhok.ac.jp/~sumi/stl/
940デフォルトの名無しさん:04/12/16 23:34:28
>>938
いえ、Win32の関数からも文字列を取得したいときがあるので
関数の引数から直接値を取得したいということです。

例えばstrcat(strcatはstring使ってるときは必要無いですが)の
第一引数から取得できる文字列を直接stringに格納したいということです。
941デフォルトの名無しさん:04/12/16 23:41:47
std::stringにはnull終端のC文字列を代入できます。
char c[256];
// ...cに何かする。
std::string s = c; // OK!
942デフォルトの名無しさん:04/12/17 00:24:31
だから256なんてマジックナンバーを(以下略
943デフォルトの名無しさん:04/12/17 00:25:47
for (;;) {
std::stirng buff;
getline(cin, buff);
if (!cin.good()) break;
}

とか

int c;
std::stirng buff;
while ((c = getchar()) != EOF) buff += char(c);
944デフォルトの名無しさん:04/12/17 00:28:08
>>943
std::string buff, temp;
while (std::getline(cin, temp)) buff += temp;
945デフォルトの名無しさん:04/12/17 00:35:02
>>940
>いえ、Win32の関数からも文字列を取得したいときがあるので
>関数の引数から直接値を取得したいということです。
「直接」は不可能でしょう
例えば以下のようなアダプタを使うと生の文字列は抹殺できるかも

#include <iostream>
#include <string>
using namespace std;
template <size_t SIZE>
class Adapt_To_Char_Array {
char tmp [SIZE];
string ⌖
Adapt_To_Char_Array (const Adapt_To_Char_Array &p);
Adapt_To_Char_Array &operator = (const Adapt_To_Char_Array &p);
public:
Adapt_To_Char_Array (string &p): target (p) {strcpy (&tmp [0], target.c_str ());}
~Adapt_To_Char_Array () {target.assign (tmp);}
operator char * () {return tmp;}
};
int main () {
char c0 [] = "hoge";
string s0 ("hage");
cout << s0 << endl;
strcat (Adapt_To_Char_Array <100> (s0), c0);
cout << s0 << endl;
return 0;
}
946945:04/12/17 00:39:23
これだとstrcatが返す値が危険か
う〜む
947デフォルトの名無しさん:04/12/17 00:47:02
>>941-
みんな>940の意味がわかるのか。すげーな。
漏れは意味わかんなかったよ。
948デフォルトの名無しさん:04/12/17 01:08:03
>>942
Win32限定でスレ違いっぽくて申し訳ないんだけれども、
GetPrivateProfileStringとか使いたいときはどうしてる?
マジックナンバー使わないとどうしようもないと思うんだ
けれども。
949デフォルトの名無しさん:04/12/17 01:26:42
>>948
nSize = 1 からはじめて、戻り値が nSize - 2 以下になるまで nSize を倍倍にしながらループ。
950デフォルトの名無しさん:04/12/17 01:32:48
うわっ。最悪。
951デフォルトの名無しさん:04/12/17 01:41:35
>>950
nSize = 256 からはじめれば満足か?
952デフォルトの名無しさん:04/12/17 01:50:35
初期値ではなくアルゴリズムが最悪
953デフォルトの名無しさん:04/12/17 01:59:14
>>952
じゃぁどうすればもうすこしマシになるんだ?
954デフォルトの名無しさん:04/12/17 03:43:27
>>948
恐らくは、WritePrivateProfileStringなどで書き出すんだろうから必要な長さは充分予測可能では?
その長さを初期値としてGetPrivateProfileStringを呼び出し、戻り値を得る。その戻り値によって
切り詰められたことが判った場合に再度呼ぶか切り詰められたままかエラー処理するかは仕様次第。
955デフォルトの名無しさん:04/12/17 10:29:29
>952
俺も952がどうやってるのか興味ある。煽りじゃない。教えてくれ
956デフォルトの名無しさん:04/12/17 10:41:23
マジックナンバーが「絶対に」駄目とか言う奴は馬鹿に決まってるだろ。
放っとけよ。
957デフォルトの名無しさん:04/12/17 10:50:37
誰か絶対にダメなんていったのか?
958デフォルトの名無しさん:04/12/17 10:58:58
>>957
>>934あたりがそういう意味のことを言ってるな
959デフォルトの名無しさん:04/12/17 11:05:35
ん?
>934が言っているのはそのケース限定では?
960デフォルトの名無しさん:04/12/17 11:15:40
スレ違いうざい。
くだ質とか初心者に行けよ。
961デフォルトの名無しさん:04/12/17 11:30:04
なんでstd::stringがスレ違いなの?
962デフォルトの名無しさん:04/12/17 11:34:48
マジックナンバーがどうとか言ってるのがスレ違いなんだろ
963デフォルトの名無しさん:04/12/17 13:11:15
俺の気に入らない奴の話は全部スレ違い
お前らなんか消えちゃえ
964デフォルトの名無しさん:04/12/17 13:14:25
965デフォルトの名無しさん:04/12/17 13:59:57
>>961
STL じゃないからでは?
966デフォルトの名無しさん:04/12/17 14:06:56
>>965
君の言うSTLの定義とは?
967デフォルトの名無しさん:04/12/17 14:11:24
std::stringがテンプレートじゃないなんて言うなよ w
968デフォルトの名無しさん:04/12/17 14:18:57
マジックナンバーなんてconstで名前をつければいいだけ。
969デフォルトの名無しさん:04/12/17 14:31:56
const NUM_256 = 256;
970デフォルトの名無しさん:04/12/17 14:43:20
半年後
const NUM_256 = 512;
971デフォルトの名無しさん:04/12/17 15:17:05
>>966-967
STLはコンテナやそれに対するアルゴリズムの部分。
文字列は違う。
STL∈標準ライブラリでSTL=標準ライブラリじゃないぞ。
972デフォルトの名無しさん:04/12/17 16:33:08
>>971
std::stringだってchar型を格納するコンテナだろ。
973デフォルトの名無しさん:04/12/17 16:40:44
>>972
格納するデータの型が固定されてるものは普通コンテナとは呼ばない。
974デフォルトの名無しさん:04/12/17 16:51:22
>>973
おいおい。まさに>>967だ。
std::stringはstd::basic_string<char>のシノニムだぞ。
975デフォルトの名無しさん:04/12/17 16:55:56
何を勘違いしているのか知らないが、STL ってのは '94 に
C++ 標準ライブラリとして採用された汎用コンテナと汎用アルゴリズムを
指すもの。
string だの iostream だのは含まれないし、ある特定の条件を満たせば
STL と呼べる、って類の話じゃないんだが。
976デフォルトの名無しさん:04/12/17 16:59:15
977デフォルトの名無しさん:04/12/17 17:06:18
>>974
なにがおいおいだか。

The C++ Programming Language, 3ed, p491.
"However, each (of built-in arrays, strings, valarrays, and bitsets)
lacks some aspect or other of the standard container interface, so
these "almost containers" are not completely interchangeable with
fully developed containers such as vector and list."
"However, basic_string does not provide as wide a selection of types
as elements."
978デフォルトの名無しさん:04/12/17 17:18:25
C++標準ライブラリチュートリアル&リファレンスでも文字列はSTLの章に入ってないしな。
979デフォルトの名無しさん:04/12/17 17:19:41
966の無知っぷりがあらわに
980デフォルトの名無しさん:04/12/17 17:25:27
>>977
それは日本語版のP567だな。都合のいいとこだけ抜き出すなよ。w

---------------------------
17.5 "おおよそコンテナ"
組み込み配列、string、valarray、bitsetは、要素を保持する型であり、
多くの用途でコンテナとみなすことができる。しかし、これらは標準コン
テナインターフェイスが提供するあれこれの機能を持たないので、
これら”おおよそ”コンテナは、vectorやlistといった完全なコンテナと
完全に交換可能な形で使うことはできない。

17.5.1 string
basic_stringは、添字演算子、ランダムアクセス反復子のほか、コンテナが
持つ便利な記述形式の大半を提供する。しかし、basic_stringで使える要素型
の選択肢は狭い。basic_stringは文字列としての用途に最適化されており、
コンテナとは大きく異なる形で使われることが多い。
---------------------------

いずれにせよ、型の固定云々は関係ないが。
981デフォルトの名無しさん:04/12/17 17:31:32
>>980
> いずれにせよ、型の固定云々は関係ないが。
書いてあるよ。
「しかし、basic_stringで使える要素型の選択肢は狭い。」
この要素の型の制約がきついから(それだけじゃないが)、完全なコンテナになりきれない
って文脈で書いてあるんだよ。
982デフォルトの名無しさん:04/12/17 20:11:55
同じく、std::vector<bool>も「STLのコンテナになりきれていない」から
STLのコンテナではないんだっけか。
983デフォルトの名無しさん:04/12/17 20:33:43
それはともかく次スレ。
984デフォルトの名無しさん:04/12/18 00:13:35
>>983
いらね
C++相談室と分ける合理的な理由ある?
985デフォルトの名無しさん:04/12/18 00:14:45
ない
986デフォルトの名無しさん:04/12/18 00:19:46
立てようか?今から風呂入ってくるから、立てろという意見の方が多かったら立てる。
立てるなというレスが多かったら放置。
987デフォルトの名無しさん:04/12/18 00:21:11
立てるな
重複すれ多すぎ
988デフォルトの名無しさん:04/12/18 00:50:12
>>987
今風呂からあがりました。
わかりました。放置します。
989デフォルトの名無しさん:04/12/18 01:28:19
具体的にstringってどこら辺がコンテナじゃないんですか?
990デフォルトの名無しさん:04/12/18 01:35:49
Effective STL
991989:04/12/18 01:47:08
すいません.ざっと見渡してみましたがstringがコンテナでないという
記述が見つからなかったです.具体的にどの部分ですか?
992デフォルトの名無しさん:04/12/18 01:52:18
>>981
そうかな?

stringはおおよその意味でコンテナとは言えるが
標準コンテナのインターフェイスを完全に備えているわけではないので
完全なコンテナとは言えない。

stringはほぼコンテナではあるが、文字列としての機能に最適化されているために
完全なコンテナ(vectorとか)と同じような使い方をされることはない。

つまりstringが完全なコンテナでない理由は
「標準コンテナのインターフェイスを完全に備えているわけではない」
と云う意味に理解したけど。
993デフォルトの名無しさん:04/12/18 01:56:29
ContainerConceptに合致するかどうかで決着つけてはどうか?
994デフォルトの名無しさん:04/12/18 02:52:23
>993
Container Conceptのモデルかどうかならモデルになるんじゃないですかね?
stringが他のコンテナのモデルと違うのは,(参照カウント実装の可能性に伴う)
イテレータ・参照・ポインタの無効化のセマンティクスの特殊性と
operator[]等が返すreferenceが真の参照型かどうかぐらいだと思うのですが,
Container Conceptではそれらについては制限していないですから.

Forward Container Conceptのモデルかどうかについては
char_traitsでoperator==等のセマンティクスを変えられるので微妙なような・・・.
http://www.sgi.com/tech/stl/basic_string.html
では,SequenceとRandom Access Containerのモデルだと言ってますけど.
995デフォルトの名無しさん:04/12/18 08:59:30
この2つへ吸収ということで次スレは作らない。

【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/l50

C++相談室 part38
http://pc5.2ch.net/test/read.cgi/tech/1101473340/l50
996デフォルトの名無しさん:04/12/18 09:18:30
STLの一般的な質問は後者で、とりわけtemplate<>についてが前者かな。

BOOSTを語れゴラァ
http://pc5.2ch.net/test/read.cgi/tech/1091198276/
もね。
997デフォルトの名無しさん:04/12/18 11:07:36
以後、STLスレを立てるやつは、

STLが使えない→STLは標準C++の一部ではない!

という思考をするDQNとみなす
998デフォルトの名無しさん:04/12/18 13:29:05
999デフォルトの名無しさん:04/12/18 13:30:25
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。