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

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2005/05/17(火) 07:53:12
>>950 assert( !bits.empty() );
953950:2005/05/17(火) 13:36:55
出典まで書いていただきありがとうございます。安心して使えます。
vectorのサイズはあらかじめ調べた上で使うので大丈夫です。
954デフォルトの名無しさん:2005/05/18(水) 07:14:25
map< string, int > str_Bufferin

str_Bufferin["やさしさ"] = 50;
char *sss = "やさしさ";

printf( "%d, %d", str_Bufferin["やさしさ"], str_Bufferin[sss] );
これは両方50が表示されますが、
:::::::::::::::::::::

map< char *, int > c_Bufferin;

c_Bufferin["やさしさ"] = 50;
char *sss = "やさしさ";

printf( "%d, %d", c_Bufferin["やさしさ"], c_Bufferin[sss] );
こっちは50と0が返るのは仕様ですか?
955デフォルトの名無しさん:2005/05/18(水) 07:19:41
とりあえず、C言語からやり直すほうが良いかもしれない。
956デフォルトの名無しさん:2005/05/18(水) 08:19:13
ポインタの基礎からやり直せ
957デフォルトの名無しさん:2005/05/18(水) 09:54:55
>>954
mapクラステンプレートの第三引数のdefaultは、less<Key>。
これを!strcmpするcomparatorに代えてはどうか?
958デフォルトの名無しさん:2005/05/18(水) 09:58:17
>>957
根本的な解決にならない悪寒。
959デフォルトの名無しさん:2005/05/18(水) 10:33:33
strcmp < 0だろ。
960デフォルトの名無しさん:2005/05/18(水) 12:31:09
961デフォルトの名無しさん:2005/05/18(水) 12:38:44
>>960
解説きぼん
962デフォルトの名無しさん:2005/05/18(水) 12:57:30
>>958
mapの外部で文字列の寿命を管理できるなら別に良いと思うけど・・・
963デフォルトの名無しさん:2005/05/18(水) 12:58:27
>仕様ですか?
(´-`)…
964デフォルトの名無しさん:2005/05/18(水) 13:20:24
>>962
それができるなら、そもそも>954みたいな質問しない気がする。
965デフォルトの名無しさん:2005/05/18(水) 14:44:20
>>960はSTLをよくわかってないまま
突っ込んじゃったな。
966デフォルトの名無しさん:2005/05/18(水) 17:43:32
>>954 これでわからなかったらもっとSTLの勉強をしろ。基本中の基本。
#include <cstdio>
#include <map>
#include <string>
#include <cstring>

struct Less {
bool operator()(const char* s1, const char* s2) const {
return std::strcmp(s1, s2) < 0;
}
};

int main()
{
std::map<std::string, int> str_Bufferin;

str_Bufferin["やさしさ"] = 50;
char *sss = "やさしさ";

std::printf("%d, %d\n", str_Bufferin["やさしさ"], str_Bufferin[sss]);

std::map<char *, int> c_Bufferin;
c_Bufferin["やさしさ"] = 50;
std::printf("%d, %d\n", c_Bufferin["やさしさ"], c_Bufferin[sss]);

std::map<char *, int, Less()> cl_Bufferin;
cl_Bufferin["やさしさ"] = 50;
std::printf("%d, %d\n", cl_Bufferin["やさしさ"], cl_Bufferin[sss]);
}
967デフォルトの名無しさん:2005/05/18(水) 17:44:48
△std::map<char *, int, Less()> cl_Bufferin;

○std::map<char *, int, Less> cl_Bufferin;

まあどっちでも同じなんだが
968デフォルトの名無しさん:2005/05/18(水) 17:50:34
>>967
同じじゃないぞ。gccは上のLess()ではエラー。
というか、関数オブジェクトではなくてクラス名を書けって。
969954:2005/05/18(水) 17:54:11
>>956さんのレスから
map< char *, なんか >は
結局char型のポインタってことなのか...と推測。
というか、ググッたら出ました、申し訳ないです。
ttp://www.google.com/search?q=map+char%E5%9E%8B&sourceid=opera&num=0&ie=utf-8&oe=utf-8

>>957さん
アドレス比較を文字列比較にするということですか、>>962さんの方法でなら一応動きますが管理の手間が増えますね...。

というわけで、解決です。

970デフォルトの名無しさん:2005/05/18(水) 18:00:39
>>968
スマソ。今"Generic Programming"の§8.1.1を見てみたら、そのように
書いてあった。アルゴリズムの比較基準と、テンプレートパラメータに渡す
比較オブジェクトは違うのね。また、叙述関数(boolを返す関数)の場合
でも()は付けちゃだめなのね。

Borlandの糞コンパイラは上の形式でもエラーなしで通すので勘違いしてた。
971デフォルトの名無しさん:2005/05/18(水) 18:06:07
つか、何処指してんだか信用できない char * を
キーにするのってどうよ?
972デフォルトの名無しさん:2005/05/18(水) 18:09:27
若気の至りです
973デフォルトの名無しさん:2005/05/18(水) 18:23:37
>>968
どうでも良いが、Less()はその文脈では「Lessを返す無引数関数」。
974デフォルトの名無しさん:2005/05/19(木) 21:58:18
Lesson1()
975デフォルトの名無しさん:2005/05/19(木) 23:55:44
ちゅーかさ、俺がほしいのはSTLじゃなくて、
STLにもう1階層かぶせたぐらいのものが欲しいんだよね。

ローカルでちょっと使う場面だとそのまんま使ってるけど、
〜の要素を増やしてとか減らしてとか取得してとか設定してとかやってると
どうしてもラッパー作っちゃうよね?
そうなるとvectorやlistも別にあってもなくてもいいかなぁ・・・とか考えちゃったりしてw
(会社じゃ覚えてる人少ないからむやみに使えないしね)

ローカルでちょっと使う場面だとそのまんま使ってるけど、
何か変換かけるたんびに一度固定長の配列に移してstr***系の関数に
ぶち込まなきゃならないからそこが面倒でたまんないよね?
そうなるとstringも別にあってもなくても(略w
976デフォルトの名無しさん:2005/05/20(金) 00:03:46
vector使わずにC++やってる会社って……
微温湯の温さに合わせていると、上がったときに風邪引くぞ。
977デフォルトの名無しさん:2005/05/20(金) 00:07:23
「ローカルでちょっと使う場面」とか、
「何か変換かけるたんびに」とか、
言っている意味がわからん
978デフォルトの名無しさん:2005/05/20(金) 00:07:41
>微温湯の温さに合わせていると、上がったときに風邪引くぞ。

誰か日本語に翻訳お願いします。
979デフォルトの名無しさん:2005/05/20(金) 00:09:11
>>978
身近の馬鹿に合わせて自分のレベルを落とすな、ってコトでしょ。
980デフォルトの名無しさん:2005/05/20(金) 00:15:43
>>977
その辺りは想像力で補間してやらないと、行数が異常に増えてしまって2chでの会話は厳しい
981デフォルトの名無しさん:2005/05/20(金) 00:16:37
そんなの余計なお世話じゃないの?
982デフォルトの名無しさん:2005/05/20(金) 00:17:16
>>976
むしろ使ってない会社の方が多い希ガス
983デフォルトの名無しさん:2005/05/20(金) 00:27:29
>>980
まずは書く側がまともな短文書くのが先だな。この場合元の文が壊れすぎだ。
984デフォルトの名無しさん:2005/05/20(金) 00:31:11
>>983
俺がわかったからいいよ。
985デフォルトの名無しさん:2005/05/20(金) 00:54:42
986デフォルトの名無しさん:2005/05/20(金) 01:19:14
&vec[0] とか c_str() とか使えばいいのにな。
ただ巨大なstring作って write(fd,s.c_str(),s.size());とかcout << s ;
とかしてやったら内容ちょろっと壊れてるのな。ヒギィ
987デフォルトの名無しさん:2005/05/20(金) 02:04:09
STLをフルに使ったプログラムで
うまくいった例ってあるの?
988デフォルトの名無しさん:2005/05/20(金) 02:05:58
ほどほどに使うor足元を固める
くらいの使い方でいいんだよね?
989デフォルトの名無しさん:2005/05/20(金) 02:08:35
>>987
つ[EmEditor]
990デフォルトの名無しさん:2005/05/20(金) 02:30:39
エディタとしては成功してないな
991デフォルトの名無しさん:2005/05/20(金) 07:28:53
>>986
例えば、
stringで保持している文字列の中の特定の文字列を別の文字列に置換する
って一度固定長の配列に移さなくても処理できるの?
c_str使っても文字列に変換かけるときって、固定長の配列にいちいち移さなくちゃできないでしょ?
992デフォルトの名無しさん:2005/05/20(金) 07:35:09
>>991
それは std::string の実装方法によるだろ。c_str()は const char* なので、
多くの実装が std::string の内部をそのまま返している(つまり、最後には
初めから '\0' が入れられている)ようだが。STLportなどのソースを読んで
みると勉強になるよ。
993デフォルトの名無しさん:2005/05/20(金) 08:12:18
>>991
char *で処理しないといけないわけでもあるのか?
994デフォルトの名無しさん:2005/05/20(金) 08:58:21
>>991
find_xxx_of()
replace()
995デフォルトの名無しさん:2005/05/20(金) 10:17:10
996デフォルトの名無しさん:2005/05/20(金) 10:20:15
>>984
発言者のオナニーじゃ意味がない
997デフォルトの名無しさん:2005/05/20(金) 11:45:50
998デフォルトの名無しさん:2005/05/20(金) 11:46:19
999デフォルトの名無しさん:2005/05/20(金) 11:46:55
1000デフォルトの名無しさん:2005/05/20(金) 11:47:30
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。