【C++】STL(Standard Template Library)相談室
528 :
デフォルトの名無しさん :
04/11/09 19:40:09 wstringを使おうとしたところ、undeclaredのエラーが出ました。 #include <string>とusing namespace stdは書いてあります。 Cygwinとg++を使っています。 何がいけないのでしょう。
>528 ・エラーメッセージを勝手に省略しない ・ソースコードの原因となっていそうな部分は最低限提示する
530 :
528 :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.) というものです。
インクルードパスのstringヘッダみりゃ分かるけど多分wstringのtypedefがコメントアウトされてる。
533 :
528 :04/11/09 20:29:18
cygwin以外にも、LinuxとSolarisで試しましたが、やはり同じエラーが出ました。
>>531 g++とだけ言われても分かりません。
>>533 g++ で wchar_t まわりをあてにしてはいけません。
はっきり言ってウンコです。
ヘッダを見ると確かにコメントアウトされていました。 typedef basic_string <wchar_t> wstring; を自分で定義してコンパイルは通ったのですが、なんでコメントアウトされてるんでしょう。 そもそもwstringはANSIで標準化されているはずだと思うんですが、 ANSIの標準ってあまり当てにならないんでしょうか。 ともかく、どうもありがとうございました。
>ANSIの標準ってあまり当てに C++のコンパイラってのは、準拠度を競ってるレベルだ、すごいだろ。
Vine2.6? wstringがdefaultで使えんのは2.9xまで。3.xになるとOK。 2.9xのテンプレート周りは3.xに比べるとゴミ。 だからVineスレであれだけgcc3にしろと騒がれてた。
cygwinではgcc3にすると完全にwstringが使えなくなりますが、なにか?
なんかはらがたってきた にゃんにゃん
なんか○○がたってきた にゃんにゃん
にゃおーん
なんか○○が○○てきた にゃんにゃん
C++やるなら、正直GCCってゴミみたいな物だから。 あまり期待し過ぎないほうがいい。
localeまわりなんて商用じゃないと手が回らないからね。
2.9xでも使えないことはないよ。 ヘッダをいじってwstringの定義を復活させて c_str()のところでcharの"\0"を返すところでエラーが出るので、 そこをちょめちょめすると使える。 あとはwcout/wcinがないのと、 定数のL"ABC"形式が使えんので自力で何とかすること。 実際にこれで仕事してたけど何ともない。
>>544 gcc3はborlandやVC6に比べればすんなりboostが使えるし
Linux上なら実行ファイルの巨大化もないのでいい感じ。
Linuxだと巨大なランタイムが標準で入ってるようなもんだからね
>>547 そうそう、gcc3は一番標準に近いよね。
マイクロソフトのQuickCなんてC99にすらまったく準拠していないし、
ボーランドのTurboC2.0とかもぜんぜん準拠していないしね。
それどころか、STLさえ付いていない。
gccの圧勝。
550 :
デフォルトの名無しさん :04/11/09 21:47:33
VBもwstring使えないんだよなw ダメダメだな、マイクロソフトw
>>546 そこまでするなら、素直にCの範疇でやってれば良いのに・・・
わざわざC++使おうとするメリットって何?
>>549 いや、まだC99もSTLもなかったころのもんだろ。
これって釣られた?
VC6も10年前の製品だよな。 何でVC2003と比較しないんだろ。
ボーランドはもうやる気ないの?
BCCの次のバージョンは100%ISO互換でexport対応だと豪語してたが。
exportイラネ
>>550 いつから gcc はマイクロソフトのものになったんだ?w
>>556 やる気もなにも上から下まで中の人が入れ替わってて
ブランドを引き継いでいるだけの事実上もう別の会社だろ。
>>555 自力で何とかすることとか書いておいてメンドイってどういうことなんだろ?
わざわざGCC使ったりいまいち意味がわからない。
>>555 今やVC++7.1だけではなく、icc-8.1もCW9.2もboost100%でありgccはかなり遅れたコンパイラ。
562 :
デフォルトの名無しさん :04/11/09 22:42:36
gccがかなり遅れたコンパイラなら bccはゴミ未満だな
結論だけ書くと、VC6≒gcc3。 だいたいこんな感じ。
英語圏の人が主に開発してるから wcha_tとかどうでもいいんだよ。たぶん
UNIXユーザはやたらUCS敵視してるDQNとかたくさんいるしな
>>564 すまん間違えた。
gcc3≒LSI-C86試食版。
大体こんな感じ。
おまいらもっと開発に貢献汁!
>>561 メンドイのは可変長のバッファサイズの管理。reallocとか。
ヘッダを数行いじるのは別にメンドクない。
gccと試食版。 雑誌の付録についてくるところとか、ユーザが中学生ってところがそっくり。 これで勉強して大人になったら本物のコンパイラを買う。
>>567 あやまれ!
LSI-C86試食版にあやまれ!
誰かAAお願い
Intel-Cは動作条件としては単体では使えない代物なので MSのやつの追加キットと考えるべきかと。
>>569 文字列定数をワイド文字にするのはいいの?
あなた書き込みが相当おかしいですよ?
>>562 えー、そのbccだってwstringぐらい使えるよーw
えー、gccだってspiritくらいつかえるよー
>>575 Linux版のicc-8.1はboost100%じゃないよ
578 :
デフォルトの名無しさん :04/11/09 23:13:27
GCCはもともとCコンパイラだからな。 C++やりたいなら、まともなC++コンパイラ買わないと・・・
>>576 spiritが使えないのとwstringが使えないのでは全然致命度が違うぞ。
wstringが使えないのはいくらなんでもお粗末過ぎる。
>>573 うん、いいの。定数をワイドにする必要の有無に関わらず、
ネット上を流れたりディスク上に保存するデータはマルチバイトなので、
変換処理はいずれにしても必要。
仕様が統一されとらんワイドキャラで通信すると
クライアントとの互換性がまずいだろ。
>>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::.'、:;;;
>>580 文字列定数と外部データを同じ土俵で比較できるの?
だったら何故、内部コードにワイド文字を使おうとする?
あなた本当に仕事でそんなことしてるの?
大丈夫?いや、あなたじゃなくてあなたの会社。
>>582 自前の正規表現マッチャやHTMLパーサがワイド専用だからだよ。
その方が性能がいいからね。
内部処理はワイド、外部はマルチ、これがポリシー。
>>583 なら、文字列定数もワイドのはずでしょ?
それとも国際化のために文字列定数を持たないポリシーとか言い出すの?
ほんと、大丈夫?
国際化のためじゃないの。 正規表現処理が高性能化するからだよ。 理由がわからなきゃ教科書嫁。
>>585 はぁ?
高性能化のために文字列を持たないの?
頭おかしくなっちゃった?
588 :
デフォルトの名無しさん :04/11/09 23:29:01
うわ、すごい反応w
ばかばかしい
盛り上がってるみたいだが、いまいち展開がわからん。 誰か解説して。
ワイドだと[あ-ん]とか出来るからとか言ったら真性だな
つーか今、内部処理だけワイドってふつーじゃん。 MSでもCOMの機能使う時とかワイドに変換して引数渡すだろ。
ワイド文字列定数を記述できないことが主題?
>>593 普通だよ。
それを
>>585 が、文字列定数はマルチバイトのほうがいいって言い張ってる。
内部処理はワイドだけど文字列定数はマルチバイトってめんどくさいはずなんだが。
(std::string(s) == CA2W(”あいうえお"))がそれほどめんどくさいと思うか?
タイポだ(std:wstring(s) == CA2W(”あいうえお"))
Cはメンドイってのが琴線に触れたっぽい。
内部処理はワイドだけど、 オブジェクトへのデータ入力がマルチバイトのインターフェイスで統一されてるから 文字列定数もマルチバイトにしてるってだけの話ならわからんでもないんだが。
>>596 L"あいうえお"よりいいと言い張る根拠は何なの?
しかも高性能化するってどういうこと?
わざわざそんなことする理由は何?
601 :
デフォルトの名無しさん :04/11/09 23:44:49
なるほど、実質二人が戯れてるわけですね
バッファオーバーフローの害について言及されている昨今、 固定長バッファのsprintfとか実にめんどくさいと思うんだが。
くだらない議論はやめてー にゃんにゃん
そこでstrstreamとみせかけてCString::formatですよ
606 :
デフォルトの名無しさん :04/11/09 23:48:42
結論だけ書くとCStringが一番いい。
boost::formatでいいじゃん。bcc55でもgcc3でもVC7でもOKだし。
608 :
デフォルトの名無しさん :04/11/09 23:53:58
boost使うとサイズが一気に10倍に!? あんなもん使えるかボケ
609 :
デフォルトの名無しさん :04/11/09 23:57:31
かボケって何?
サイズなんか気にすんな
どうしたんだみんな、今夜はやけにノリノリじゃないか?
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 をバッファとして使いたくて上記のコードを書いているのですが、 うまくいかなくて悩んでいます。
いくらVC6とはいえ、一文字しか入れてないのにsizeが1にならなかったらダメでしょう。 str.reserve(4096); としてみては?
>>615 ありがとうございます。
resize() をしているので、4096 になるべきだと思いますが。。。
で、私の手違いだとということが分かりました。
void func(string* line)
{
line->resize(4096);
line[0] = '*';
int n = line->size();
}
こんなことをしていたので間違ってしまいました。
line はポインタなので
(*line)[0] = '*'
としたら正常に動作しました。
と思ったけどresizeでも4096にならないとダメな気が… VC6は窓から投げ捨てましょう
>>614 VC++6.0+付属STLでやってみたが4096って出るが。
C++なら小難しいポインタは捨ててできるだけリファレンスを使え。 void func(string& line)
heapオブジェクトの参照はとれますか
>>620 「heapオブジェクト」とは何ですか?
const以外で参照を渡すのは見ていて吐き気がするのでやめてください
中身を変えたい時はconst castですか?
>>622 上のスレの流れちゃんと見て発言してる?
>>621 たぶんnewでメモリを確保したオブジェクトの事だろう。
628 :
デフォルトの名無しさん :04/11/10 17:03:40
コピーコンストラクタが使えない時は ポインタは使うしかないよね?
629 :
デフォルトの名無しさん :04/11/10 18:45:32
>>628 オブジェクトのコピーだろ?
GCCなら、やり方によっては何もしなくても参照にしてくれるぞ。
>>623-625 引数はポインタで受け取って、関数の頭で参照に入れればいい。
C++の参照渡しは呼び出す側は値渡しと同じ記述になってしまうので
後から見たときに値が変更されている可能性を発見しにくい。
値を変更するときは避けるのが常識。
C#ではout/refをつけることでこの問題を回避したね。
>>630 それを言うならポインタだって同じじゃん。主張の意図がよくわからん。
constやreferenceは、callerを見ても、それがそうであると解からん、 そういう話だな。 ポインタ渡しだと指標になる、と。
>>632 そこまで行くとコーディングスタイルの問題だな。自分の常識を人に
むやみに押しつけないように。
俺のコーディングスタイルだと、 ポインタ渡しするのは、ナルポインタを使いたいときだな。
636 :
デフォルトの名無しさん :04/11/10 21:10:02
俺は値渡し以外認めないよ?
参照アドレスの値渡し
&記号が嫌いなので、俺はconstでない参照渡しをよく使う。 値を変更するかはヘッダで判断。 ただし、親オブジェクトを指定するのにはポインタ渡しを使う。 親からthisを渡す場合がほとんどだから。
値渡しと参照渡しが判別しにくいと言ってる人に聞きたいのだが、 君らは前方宣言で引数の型の確認もせずに関数を使うのかい?
>>639 コードを書くときの話じゃなくて可読性の問題。
少なくとも&がついてりゃそのことだけでアドレス渡しをしてることが
一目瞭然だけど、参照の場合、関数宣言を確認しないとわかんない。
641 :
デフォルトの名無しさん :04/11/10 23:34:12
STLのstringの中で保持していると思われる文字列のバッファって、 デストラクタの中で解放されてるんでしょうか? なんかメモリがどんどん増えているんですが。 普通、閉じ括弧(})に来たときにデストラクタって自動で呼ばれるんですよね? 他にnewやmallocは使っていないので、stringしか考えられないんですが。
メモリが勝手に増えてくれたら嬉しくて悲鳴上げそうだ。
>>642 ポケットのなかには ビスケットがひとつ
ポケットをたたくと ビスケットがふたつ
もうひとつたたくと ビスケットがみっつ
たたいてみるたび ビスケットがふえる
>>643 そんなふしぎなポケットがほしい
そんなふしぎなポケットがほしい
,、‐ ''"  ̄ ``'' ‐- 、 /イハ/レ:::/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/ ',
ここは気色悪いスレですね
>>643 ポケットのなかには ビスケットがひとつ
ポケットをたたくと ビスケットがふたつ
×もうひとつたたくと ビスケットがみっつ
○もうひとつたたくと ビスケットがよっつ
ビスケットの数は増えていくが 一つ一つは小さくなって 結局総量は変わらないという罠
>>647 まだまだあまあまちゃんねー にゃんにゃん
for (i = 0; i < 1000; i++) { memset(&(std::vector<char>(100)[0]), 0, 100); } これリークすると思ってるのかな?
結局
>>622 は、個人の好みの問題を他人に押しつける基地外ってことだね。
>>648 いや寧ろ、細かな破片が生じる分食べられる分量は減るところまで考慮しなければ。
#つーか、それって単なる破砕だね。
しかし、誰が作ったんだろうな、こんなツッコミどころの多い歌。
>>640 漏れも参照渡しは好きじゃない。理由は同じくソースの可読性
#define ByRef
とか書いて test( ByRef str ); とか書くのも気持ち悪いし
test( ByRef(str) ); もなんか違和感有るし
気持ち良い書き方は無いのかな・・
つーか、ポインタ渡しとconstポインタ渡しだって関数呼び出し側だけじゃ区別つかないだろうに。
最悪だぞそれ
void assign_hello( std::string& str ){ str = L"Hello!"; } はダメ、 void assign_hello( std::string& str ){ str.assign( L"Hello!" ); } ならOK。 微妙な乙女心。
>>661 cout << typeid("Hello").name() << endl;
cout << typeid(L"Hello").name() << endl;
すれば一目瞭然
ごめんなさい、>>660-
>>662 が何の話をしてるか解かりません。
どなか解説してください。
>>660 おねえさまはどうしてそんな話を持ち出されたのかしら。
stringの代入演算子にrhsがwchar_tの物が定義されてないって事か? 普通だったらwstringを使おうという発想が出てきそうなものだが・・・・
ごめん。Lはただの間違い。いつもの習慣でつけちゃった。 662は何が言いたいのかよくわかりません。 void assign_hello( std::string& str ){ str = "Hello!"; } void assign_hello( std::string& str ){ str.assign( "Hello!" ); } に訂正してお詫び申し上げます。 (結果が同じでも)代入目的で参照を受け取るのはイヤ。 戻り値にするべき。
>>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>]
・・・・・
以下略。
ちなみに一個目の関数はコメントアウト。
>>666 fstreamのオブジェクトを他関数に渡す時は?
>>666 を見ても、まだ何が言いたいのかわからない私はダメ人間ですか?
とんち?
void append_hello( std::string& str ){ str += "Hello!"; } はダメ void append_hello( std::string& str ){ str.append( "Hello!" ); } ならOK さてな〜んだ♪
>>666 > 662は何が言いたいのかよくわかりません。
ワラタ
>>666 >>661-662 はoperator =()にconst wchar_t *を受け取るものはないがassignにはあるんだとでも思ったんだろう。
>>666 元々代入じゃなかった関数の中身が諸々の事情で
代入になった場合には、結果が同じでも関数の型を変更する気ですか?
俺も何が言いたいのか分からん エスパーいないのか?
気分の問題なんだってさ。 operator=は特別なんだろう、彼にとって。
std::mapのキー値をchar*型としてstrcmpと同じような比較関数を指定したいんですが、どうやって指定すればいいんですか?
struct MyLess { bool operator < (const char *lhs, const char *rhs) const { return strcmp(lhs, rhs) < 0; } }; std::map<char *, value_type, MyLess> myMap;
operator () の間違い。 struct MyLess { bool operator () (const char *lhs, const char *rhs) const { return strcmp(lhs, rhs) < 0; } }; std::map<char *, value_type, MyLess> myMap;
それぐらい用意しとけよ、って思うけど、basic_string使って欲しいんだろうね。
basic_stringのコピーのコストが馬鹿にならないときもあるからねえ。 参照のみの文字列は重複なしでプールに叩き込んどいて、ポインタだけで 処理ってのも、少なくないな。 stringにしたって、数千〜数万のオーダーにでもならない限り目に見えて 差が出ることはあまりないけどね。
出来ました。 ありがとうございました。
番号違いましたねorz
basic_stringは参照カウンタうるからそんなにコピーのコストは低いしね
>>684 それは何回も言うように処理系依存。Copy on Writeが標準だとでも?
テンプレに処理系ごと実装を貼り付けるしかないのかな。 調べるの面土居けど。
Copy on Writeって何? ググっても詳しいのが出てこない
オブジェクトのコピーをするとき、実体を共有するだけにしとくことで、小メモリ高速化を計る仕組み。 このままだと共有してるオブジェクトを変更すると別にコピーも変更されちゃう。 だから、変更操作しようとしたときに、そのオブジェクトの実体を(ほんとに)コピーする。 Linuxのメモリ管理とかでも使われてる枯れた手法。
共有してるかどうかを判断するために参照カウンタを持つわけだね。
listで以下の処理をしているのですが、 pop_back(); push_front(front()); front().update(); これをもっと効率良くする方法は無いでしょうか。 もしくは環状リストとして使う方法を知りたいです。
>>691 back()の領域を再利用したいんです。
queue ?
>>695 成る程。これで解決しそうです。
ありがとうございました。
spliceで解決なのか?
splice でなんか問題あるの?
最後のを最初に移動したいだけ
701 :
デフォルトの名無しさん :04/11/16 23:02:15
setのinsertの返り血で、pairを返したときに、 secondのbool値は何を意味するんでしょうか?
挿入出来たかどうか multi- では単に iterator だけが返されるようになる
703 :
デフォルトの名無しさん :04/11/16 23:09:00
>>702 setの仕様がよく分かってないんだけど、
挿入できたかどうか、っていうのはユニークな値かどうかってこと?
set ではキーの重複は認められないので挿入出来ないときがあるっしょ。
705 :
デフォルトの名無しさん :04/11/16 23:22:17
706 :
デフォルトの名無しさん :04/11/16 23:30:24
>>704 そうだったんですか。
ありがとうです。謎は全て解けました。
707 :
デフォルトの名無しさん :04/11/18 14:33:52
hash_mapを使用していますが、件数が多くなるにつれて検索速度が落ちます。 検索を早くする方法はありませんか? キーは文字列です。
> 件数が多くなるにつれて検索速度が落ちます。 件数がいくら多くなっても検索速度が落ちないコンテナなんてないです。
量子コンテナ
強いていうならハッシュ関数が悪いと衝突が多くなって急速に性能が劣化する
>>710 ハッシュ関数が悪くなくてもロード率が上がれば衝突が多くなる。
衝突する率を下げるにはどうすれば?
テーブルを大きくする。 ハッシュ関数の性能を上げる。
gperfなら衝突しないよ
ハッシュと赤黒併用すれば?
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 情報内)。 これはどういう意味なのでしょうか。
VC6 は窓から投げ捨てろっていう意味
>>716 散々ガイシュツ。もう答える気力もない。
>>716 ヘルプ読めって、よく周りの人たちから言われない?
>>717-
>>719 知らないなら、いちいち糞レスしなくていいよ (プ
721 :
716 :04/11/19 01:18:48
ググったら普通に解決したよ。 ここにいる連中はgoogle以下のクズばかりだな。 C4786は無視してよい。出さないためには #pragma warning(disable:4786) を書く。
Googleで検索すれば解決するような問題を一々質問するから煽られるわけだが。
つーか完全には解決してない希ガス
カスだから。
>>724 完全な解決法も知らないくせに (・∀・)ニヤニヤ
ゴキブリホイホイとしてしっかり機能しているな
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とか使わなければならないんでしょうか。
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか? itoaとか使わなければならないんでしょうか。
732 :
デフォルトの名無しさん :04/11/19 20:33:11
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか? itoaとか使わなければならないんでしょうか。
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とか使わなければならないんでしょうか。
std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか? itoaとか使わなければならないんでしょうか。
std::stringstream std::istringstream std::ostringstream boost::lexical_cast
739 :
デフォルトの名無しさん :04/11/19 20:40:48
すいません、便乗質問なんですけど、 std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか? itoaとか使わなければならないんでしょうか。
すいません、似たような質問なんですけど、 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とか使わなければならないんでしょうか。
ググったら普通に解決したよ。 ここにいる連中はgoogle以下のクズばかりだな。
一人で貼ってたならマジうける(w
むかつくー でも、問題があるんですけど、 std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか? itoaとか使わなければならないんでしょうか。
>738をご利用ください
うわぁツマンネ 何コレ
重複スレなのによくこんなにのびたなあ。 削除依頼も出なかったとは。
750 :
デフォルトの名無しさん :04/11/19 23:56:12
まんこ攻撃しちゃおっかな
751 :
デフォルトの名無しさん :04/11/19 23:56:58
まんこ
お前ら何なの<(`д´<
携帯からなので過去ログが読めません。既出だったらすみません。 std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか? itoaとか使わなければならないんでしょうか。
755 :
デフォルトの名無しさん :04/11/20 09:21:32
あまんこ
振り出しに戻った? というわけで改めて。 std::stringには、文字列を数値に変換したり、数値を文字列に変換したりする関数はないんですか? itoaとか使わなければならないんでしょうか。
>738をご利用ください
758 :
デフォルトの名無しさん :04/11/20 11:51:10
まんこ
>>756 int a;
std::stringstream s;
a = 10;
s << a;
std::printf("%s\n", s.str());
>>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などとやってもだめです。 解決方法を教えてください。
str.c_str() + std::distance(str.begin(), it)
iteratorはポインタで実装されているとは限りません。ポインタで 実装されているかは処理系定義です。まともな実装ほど、クラスで 実装されているように思いますが。 std::basic_string<>にはc_str()という関数があるのを知っていますか?
765 :
761 :04/11/20 13:09:15
c_str()の存在は知っています。 ただ、このポインタが指すchar配列の寿命がどれくらいか分からないので 困っているのです。 たとえばスクリプトの解読をする場合にも使っていいのでしょうか。 この場合、プログラムの最初の方でc_str()でポインタを取得し、 その後このポインタを進めていくことになるのですが。
>>765 心配ならc_str()から他のnewして確保した領域にコピーしとけ。
767 :
761 :04/11/20 13:19:34
そうですね。Cの関数を使う時は、Cで用意されているものだけ使った方がいいのかもしれませんね。 一応、itの代わりに、&(*it)でコンパイルは通り、ちゃんと動いてはいるようなのですが、 このような使い方がよいのかどうか不安です。
>>767 だからイテレータをそういう用途に使うなと小一時間
なんでスクリプトの解釈にイテレータを使わない? ポインタにしないと速度が遅いからか? それなら初めからstd::stringを使わない方がいい。筋違いだよ。
770 :
761 :04/11/20 13:38:08
sscanfを使いたいんですよ。スクリプトの解読にはこの関数が一番使いやすいんです。
ただ文字列はほとんどstd::stringで管理しているので、
この組み合わせができないかと思っていたんです。
C++にsscanfのような機能があればいいんですが。
ともかくもう結構です。
>>766 の方法でやります。
まぁ、どんな方法でも構わないけど。 boost::lexical_castでも似たようなことできるのに。
boost::regexでも使った方が幸せになれるのに。
>>770 > sscanfを使いたいんですよ。スクリプトの解読にはこの関数が一番使いやすいんです。
ネタかよ…
あんな糞関数を…
>>770 みたいのがいるからいつまでたってもscanf()の脆弱性をついたアタッカーが
のさばる羽目になるんだ。
boostはstlではない。標準ではない。必ず使えるものではない。
一応まじめに注意点を。&(*it)で得られるポインタは使い物になるとは限らない。 なぜならば、以下の保証がないから。 ・std::basic_string<>の内部で、連続した単一のバッファ上にデータを保持している保証 ・終端が'\0'で終わる文字列である保証 ・終端以外の文字に'\0'が入っていない保証
>>775 開発者がインストールすれば使えるじゃないか。
そしてユーザはBOOSTをインストールしなくても良い。
はぁ?BOOSTもランタイムライブラリ必要だぞ。
static linkすればええやん STL素敵やん
boost1.32.0 releaseキタ スレ違いスマソ
自分で分かってるなら書くなよ
>>774 sscanf()を使うことと、scanf()の脆弱性を付いたアタッカーがのさばることの因果関係は?
785 :
デフォルトの名無しさん :04/11/20 22:12:00
みなさん VC6 で STL を使うときって、 Dinkumware のバグ修正を手でやってます? 何か一発修正してくれるツールとかありませんか?
stlportを入れる
>>786 STLport は VC6 と相性いいですか?
使いやすいですか?
VC付属より200倍は使いやすい
そうですか、ありがとう。使ってみることにする。 VC7.1 の STL と比べてどうでしょうか?
とても締まりがいいです
前から (゚Д゚) 後ろから!
○ャノン勤務?(w
794 :
デフォルトの名無しさん :04/11/22 10:14:51
そうだな お手洗いだったか
この会社って○ャノンって言うと怒るんだよな
ここはキ○ノンと呼べば丸く収まる予感。 ただ俺にはキセノンに見えてしまうという罠。
799 :
デフォルトの名無しさん :04/11/23 16:10:29
だれか次のようなプロトタイプを持つ、 stringの前後にある空白文字を除去するプログラムを作ってください。 お願いします。 std::string trim(std::string str) { /*ここに空白除去のコードを書く*/ return str; }
800 :
デフォルトの名無しさん :04/11/23 16:11:30
空白文字は、スペース、タブ、復帰改行です。
車輪の再発明をするよりは、 素直にboostのstring algorithmにあるtrimを使う方がいいんじゃないかと… STLスレなんだけどな('A`)
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); } 最発明ってほどのことでもないだろ
>>802 spaceはconst char *でもいいんじゃないか?
>>802 find_last_not_of の戻り値って、引数に含まれる文字を指すの?
そうじゃないと、1文字減っちゃうよね?
>>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
>>801 それならCString::TrimLeft()を使うのもありだな
810 :
デフォルトの名無しさん :04/11/23 17:24:09
>>654 歌を作った人は、べつにビスケットが割れることによって数量が増えるということを
意図したわけではありませんよ?
>>808 CStringのソースを参照するというなら兎も角、そのまま使うというならスレ違いだな。
潰しが効くってどういう意味?
>>814 いろいろ応用できるってことだよー にゃんにゃん
>>815 最近良く見るその語尾のにゃんにゃんっての元ネタ何?
>>802 連続したスペースなどだったら使えないな〜
使えるだろ
>>818 817と同じ意味かどうかは知らんが、
src内にスペース以外の文字が一つも含まれていなければ失敗するね。
821 :
デフォルトの名無しさん :04/11/24 14:23:10
int val; std::list<int> vallist; val=*vallist.end(); この時valには何が入るんですか?
823 :
デフォルトの名無しさん :04/11/24 14:57:32
じゃあなんでコンパイルが通るんだよ
>>823 そりゃ、未定義だもん。どうなったって規格上OK。
ダメって定義されてるならコンパイル通らないだろうけどさ。
(そもそも静的にはチェックできないが。)
>>823 君が言っている事は
int a[10], i;
i = a[10];
でコンパイルが通るな、と言っているのと意味的にほとんど変わらん。
未定義の定義がはっきりしてないな。 まあ答えは"intと同じサイズのゴミ"なわけだが。(俺の環境では)
828 :
821 :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()である
}
829 :
821 :04/11/24 16:19:52
分かると思いますが、Find(int x)は、クラスHogeのリストの中から 最初にvalueがxと一致した要素を返すものです。 もし一致する要素がなければ、エラーということにしたいのですが、 この時何を返してたらいいのかが分からないのです。 エラー判定用の引数をつけるという方法もありますが、あまりスマートではないので。
Hoge型を返すんじゃ無理だな。 list<Hoge>::iteratorを返すようにすればFind(foo) == hogelist.end()で比較できる。 ってこれじゃ830の言う通りfind_if()で代用できるじゃないか。
例外投げて呼び出し側でcatchするとか
ありがとう。find_if()を調べてみるよ。
>>828 がんばれよ。
でも今後は、丁寧に質問しような。
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回目以降、異なります。 ストリームをクローズしているのに?どうしてこのようなエラーが・・・。 ご存じの方、いらっしゃいましたら、ご教授願います。
C#スレに帰れ
ストリームのクローズとファイルのクローズは違う。 ・・・とかC#なんて見たこともないのに言ってみる。
821って中学生?
>>839 最近良く見るその中学生?っての元ネタ何?
ふつーにつかわないかね?
普通に使うよね。 最近生まれた言い回しでもないし、そんなによく見るわけでもない。
844 :
デフォルトの名無しさん :04/11/25 21:45:27
auto_ptr って使ってますぅ? なんとなく使うの怖くないですか?
std::auto_ptr<>もboost::shared_ptr<>も使えないほうが怖すぎ。
new []をauto_ptrに突っ込むことほど怖い物はない。
deleteしたポインタを使うよりはマシ
848 :
デフォルトの名無しさん :04/11/25 22:48:41
vector に new した構造体のポインタを入れておいて、 後で列挙して delete する、っていうような作業がよく発生するんですけど、 こういうのを自動化してくれるモノはないんでしょうか。
スマートポインタとvectorを組み合わせて使う
>>848 そういうvectorの派生クラスでも自作する
851 :
デフォルトの名無しさん :04/11/25 23:20:38
>>850 こんなのでいい?
template<typename T>
class auto_vector : public vector<T> {
~auto_vector(void) {
// ここで delete
}
};
>>851 vector<hoge>* ptr = new auto_vector<hoge>;
…
delete ptr; // あぼーん
reference counting
referrence
といった間違いをしないように。 (例) 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番目の要素を表示するにはどうすればよいのでしょうか?
>>857 質問の意味がよくわかりません
list1 4 3 2 1 0
list1 3 2 1 0
と出ますがどういうことしたいのですか?
>>858 わかりにくくてすいません
いまlistの勉強をしてまして
list1の一番初めの要素を削除する実験をやってたんです
list1の3番目の要素を削除する方法も知りたいです
>>859 beginでとったイテレータを3回インクリメントするか
std::advance
2回の間違いね
lisper?
イアーウィスパー
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; }
>>865 です。
T(const T &t){ cout << "Copy Construct" << endl; }
というコピーコンストラクタを作成してみたところ、
1
2
Construct
Copy Construct
Destruct
3
4
Destruct
という結果になりました。コピーコンストラクトされているのかな。
もうちょっと本を読んでみます。
何故こんな事すら知らない香具師が STL 使ってるのかが激しく疑問だ
>>867 あなただって最初は何も知らなかったでしょう。
無知をバカにする姿勢はよろしくない。
そうだそうだ
くりーむそーだ
>>865 です。
Effective STLの第3項に該当情報がありました。
コピーされるのですね。んで、ポインタのコンテナにするよりも、
スマートポイントのコンテナにした方が良いということがわかりました。
>>867 ごめんなさい。
>>872 余計なお世話かもしれないが、auto_ptrはだめだぞ。
EffectiveSTL読んでるんだったらわかると思うが。
しかしboost::shared_ptrにstd::mem_fun適用しようとすると怒られるな。
素直にboost::mem_fn使えって事か。boostのいくつかが早く標準化
するまではこうしたゴタゴタを承知の上で使って行かなければならんなー
auto_ptrを無条件にダメという奴はgotoを無条件にダメと言ってる奴と大差ない
そうだそうだ。お兄ちゃんに謝れ。
>>874 アルゴリズムでコンテナの中身をいじくる奴を動かすと大変な事になるだろが。
それに、COAPがそもそもコンパイルを通さない場合もあるし。
知ったか君は帰っていいよ。
>>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
だいたい標準C++はauto_ptrをコンテナに入れる事自体を禁止している。 auto_ptrはリソース・リーク対策だけに限定して使うべきだ。
STLコンテナの要素にauto_ptr使うのは無条件にダメだろ。
>>874 はgotoは無条件に駄目な人なんじゃないか? (w
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を用意するのは面倒くさいなと思いまして。。。
>>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 []を実装するのは自由です
class名setは変えたが良いかも
>>884 >わざわざiteratorを用意するのは面倒くさいなと思いまして。。。
ちなみにこの理由でiteratorを使わないのはどうかと思いますよ
setにはoperator[]はないので無理です。 それはそうとみんなsetとmapどう使い分けてるんだろう・・・
(;´Д`)エー
それはそうとみんな箸と茶碗をどう使い分けてるんだろう・・・
箸:叩く 茶碗:叩かれる (・∀・ )っ/凵 ⌒☆チン
それはそうとみんなぬるぽとガッをどう使い分けてるんだろう・・・
それはそうとC++とRubyをどう使い分けてんだろう
使い分けるも何も、C++とperlぐらいしか使える言語がありません_| ̄|○
(自宅では)適材適所で、 C++, awk, sed, csh, sh, JavaScript を使い分けてます。
>>885 継承しなくてもグローバルにtemplate<typename T> operator [](std::set<T> Set, std::size_t n)ってできなかったっけ?
これができるんだったらtemplate<typename T> operator [](T Container, std::size_t n)にした方がいいような。
>>896 言いたかったのは
>ただライブラリはそののまま使わなくてもいいのですよ
です
継承はまぁ例です
ちなみにグローバルにoperator []は定義できませんよ
898 :
デフォルトの名無しさん :04/11/28 18:32:26
Ruby以外の言語はkぜうんぶくそ!
るびぃいいいいいいいいいいいいいいいいいいいいいいいい
#include <iterator>してadvance()使え。
遅くなってすいません。 参考になりました。ひとまずiterator使うのに慣れるようにします。 ありがとうございました。
902 :
デフォルトの名無しさん :04/11/29 12:03:43
そろそろ1000とりはじめるか
この早漏めがっ!!
STLの ofstreamで クラスオブジェクトを丸ごとバイナリファイルに保存したいんですが、 そのクラスにvectorのメンバ変数が存在します。 このままだと普通に保存できないんですが、どうしたらいいんでしょうか? このvector変数はprivateになってます。
>>904 シリアライズ/デシリアライズ処理を自分で書く
次の方どうぞ
908 :
お願いします :04/12/01 21:21:26
>>908 本当に
int& c = counter[*it];
で落ちてるの?
if (counter.find(*it) == counter.end()) {
counter.insert(ValueCounter::value_type(*it, 0));
}
いれて動くからといって原因がここだとは限らないよ
ちなみにg++では正常に動いているように見える
>>909 ええ、たしかにそこで落ちました。
詳しくいいますと、map.insert() の実装のツリーの中で落ちました。
以前は元のままでも VC6 で動作したのですが、
プログラムを複雑にしているうちに、
そこでエラーが発生したんです。
VC6 のバグではないかなとも思うのですが。。
処理系のバグと自分のバグと… 確率ととしては(以下省略いたします
VC6+STL → OTL
913 :
デフォルトの名無しさん :04/12/01 23:24:49
OTLと書いて「窓から投げ捨てろ」と読む。
なんお略語ですか?
Old fart Template Library
>>913 O=頭
T=腕
L=足
顔文字というか体文字?
普通に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; }
kuzuOre Template Library
vectorの代入で質問があります。 vector<MyClass*> v1, v2; v1 = v2; はコンパイルを通るのですが vector<const MyClass*> v1; vector<MyClass*> v2; v1 = v2; だとコンパイルを通りません。 もちろんassignメソッドなどを使ってコピーするなりすれば値のコピーはできるのですが それだと関数の引数がconstになっている場合などはconstの一時変数を作ってコピーを 行った後でその変数を引数として渡すというような処理が必要になります。 上記のような場合やdoubleのvectorにintのvectorを代入したいといった場合は どのような処理をするのが望ましいのでしょうか?
for文でインデックスを回しながら代入していくのがいいんじゃない?
>>921 説明不足ですみません。
vector<MyClass*> vec;
MyClass *obj = new MyClass();
vec.push_back( obj );
のようになっているとして、上記の変数vecを
void func(const vector<const MyClass*> &);
のような内部でvectorの要素のオブジェクトの変更を行わない関数の引数として
func( vec );
のように使用するとコンパイルができない。
という趣旨の質問です。
そりゃあなた、vector<const MyClass*>とvector<MyClass*>は まったく違う型だから、代入とかコピーとかできませんよ。 別の型が格納されたコンテナ間のコピーをするための テンプレート関数でも書けばどう?
>>922 正攻法 func(vector<const MyClass*>(vec.begin(), vec.end()));
キャストfunc(reinterpret_cast<vector<const MyClass*>&>(vec));
何度もやるのならこういうことするinline関数を書けば良いさ。
>>923 なるほど。違う型の扱いになるんですか。
const char*にchar*が代入できるのと同じ感覚で代入できるのかと思ってました。
勉強になりました。
>>924 これだと一時変数を作ったりしないで望んだ動作ができそうです。
アドバイスありがとうございました。
926 :
デフォルトの名無しさん :04/12/04 00:22:47
double* data は数値データの配列とします。 この中から最大値を求めるには STL 的にスマートに書くとどうなるでしょうか? data に格納されているサイズは int data_size としてあらかじめ分かっています。 よろしくお願いします。
max_element
std::max_element(data, data+data_size);
>>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; とかやっております。 なにか文字列関数を使うたびにこんなことやっておりますが 実際はどう使ったらいいものなのでしょうか?
substr operator=
std::stringはSTLじゃない。 とっととstd::stringの使い方を覚えろ。
>>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;
>>C++使いならせめて ( ´,_ゝ`)プッ。噴いたじゃねーか。
>>934 …std::basic_string<>::copy()は何のためにあるのかと。
937 :
デフォルトの名無しさん :04/12/16 23:02:35
みなさん色々とアドバイスありがとうございます。 とりあえずですね、 文字列を受け取るのに 一旦、char temp[256]とかにうつしてからstring dirに格納するという 動作がかなりバグの元になっているのでなんとかしたいのですが どうにかならないものでしょうか? できればプログラムからchar型での文字列の扱いを無くしたいと考えております。
temp_strっていうstringから最初の5文字をdirに移せば良いんですか? dir.assign(temp_str.begin(), temp_str.begin() + 5); こういうことですか?
>>938 いえ、Win32の関数からも文字列を取得したいときがあるので
関数の引数から直接値を取得したいということです。
例えばstrcat(strcatはstring使ってるときは必要無いですが)の
第一引数から取得できる文字列を直接stringに格納したいということです。
std::stringにはnull終端のC文字列を代入できます。 char c[256]; // ...cに何かする。 std::string s = c; // OK!
だから256なんてマジックナンバーを(以下略
for (;;) { std::stirng buff; getline(cin, buff); if (!cin.good()) break; } とか int c; std::stirng buff; while ((c = getchar()) != EOF) buff += char(c);
>>943 std::string buff, temp;
while (std::getline(cin, temp)) buff += temp;
>>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;
}
これだとstrcatが返す値が危険か う〜む
>>941 -
みんな>940の意味がわかるのか。すげーな。
漏れは意味わかんなかったよ。
>>942 Win32限定でスレ違いっぽくて申し訳ないんだけれども、
GetPrivateProfileStringとか使いたいときはどうしてる?
マジックナンバー使わないとどうしようもないと思うんだ
けれども。
>>948 nSize = 1 からはじめて、戻り値が nSize - 2 以下になるまで nSize を倍倍にしながらループ。
うわっ。最悪。
>>950 nSize = 256 からはじめれば満足か?
初期値ではなくアルゴリズムが最悪
>>952 じゃぁどうすればもうすこしマシになるんだ?
>>948 恐らくは、WritePrivateProfileStringなどで書き出すんだろうから必要な長さは充分予測可能では?
その長さを初期値としてGetPrivateProfileStringを呼び出し、戻り値を得る。その戻り値によって
切り詰められたことが判った場合に再度呼ぶか切り詰められたままかエラー処理するかは仕様次第。
955 :
デフォルトの名無しさん :04/12/17 10:29:29
>952 俺も952がどうやってるのか興味ある。煽りじゃない。教えてくれ
マジックナンバーが「絶対に」駄目とか言う奴は馬鹿に決まってるだろ。 放っとけよ。
誰か絶対にダメなんていったのか?
ん? >934が言っているのはそのケース限定では?
スレ違いうざい。 くだ質とか初心者に行けよ。
なんでstd::stringがスレ違いなの?
マジックナンバーがどうとか言ってるのがスレ違いなんだろ
俺の気に入らない奴の話は全部スレ違い お前らなんか消えちゃえ
ぷ
std::stringがテンプレートじゃないなんて言うなよ w
マジックナンバーなんてconstで名前をつければいいだけ。
const NUM_256 = 256;
半年後 const NUM_256 = 512;
>>966-967 STLはコンテナやそれに対するアルゴリズムの部分。
文字列は違う。
STL∈標準ライブラリでSTL=標準ライブラリじゃないぞ。
>>971 std::stringだってchar型を格納するコンテナだろ。
>>972 格納するデータの型が固定されてるものは普通コンテナとは呼ばない。
>>973 おいおい。まさに
>>967 だ。
std::stringはstd::basic_string<char>のシノニムだぞ。
何を勘違いしているのか知らないが、STL ってのは '94 に C++ 標準ライブラリとして採用された汎用コンテナと汎用アルゴリズムを 指すもの。 string だの iostream だのは含まれないし、ある特定の条件を満たせば STL と呼べる、って類の話じゃないんだが。
>>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."
C++標準ライブラリチュートリアル&リファレンスでも文字列はSTLの章に入ってないしな。
966の無知っぷりがあらわに
>>977 それは日本語版のP567だな。都合のいいとこだけ抜き出すなよ。w
---------------------------
17.5 "おおよそコンテナ"
組み込み配列、string、valarray、bitsetは、要素を保持する型であり、
多くの用途でコンテナとみなすことができる。しかし、これらは標準コン
テナインターフェイスが提供するあれこれの機能を持たないので、
これら”おおよそ”コンテナは、vectorやlistといった完全なコンテナと
完全に交換可能な形で使うことはできない。
17.5.1 string
basic_stringは、添字演算子、ランダムアクセス反復子のほか、コンテナが
持つ便利な記述形式の大半を提供する。しかし、basic_stringで使える要素型
の選択肢は狭い。basic_stringは文字列としての用途に最適化されており、
コンテナとは大きく異なる形で使われることが多い。
---------------------------
いずれにせよ、型の固定云々は関係ないが。
>>980 > いずれにせよ、型の固定云々は関係ないが。
書いてあるよ。
「しかし、basic_stringで使える要素型の選択肢は狭い。」
この要素の型の制約がきついから(それだけじゃないが)、完全なコンテナになりきれない
って文脈で書いてあるんだよ。
同じく、std::vector<bool>も「STLのコンテナになりきれていない」から STLのコンテナではないんだっけか。
それはともかく次スレ。
>>983 いらね
C++相談室と分ける合理的な理由ある?
ない
986 :
デフォルトの名無しさん :04/12/18 00:19:46
立てようか?今から風呂入ってくるから、立てろという意見の方が多かったら立てる。 立てるなというレスが多かったら放置。
立てるな 重複すれ多すぎ
>>987 今風呂からあがりました。
わかりました。放置します。
具体的にstringってどこら辺がコンテナじゃないんですか?
Effective STL
すいません.ざっと見渡してみましたがstringがコンテナでないという 記述が見つからなかったです.具体的にどの部分ですか?
>>981 そうかな?
stringはおおよその意味でコンテナとは言えるが
標準コンテナのインターフェイスを完全に備えているわけではないので
完全なコンテナとは言えない。
stringはほぼコンテナではあるが、文字列としての機能に最適化されているために
完全なコンテナ(vectorとか)と同じような使い方をされることはない。
つまりstringが完全なコンテナでない理由は
「標準コンテナのインターフェイスを完全に備えているわけではない」
と云う意味に理解したけど。
ContainerConceptに合致するかどうかで決着つけてはどうか?
>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のモデルだと言ってますけど.
以後、STLスレを立てるやつは、 STLが使えない→STLは標準C++の一部ではない! という思考をするDQNとみなす
う
ん
も
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。