【C++】STL(Standard Template Library)相談室 2
>>950 assert( !bits.empty() );
953 :
950:2005/05/17(火) 13:36:55
出典まで書いていただきありがとうございます。安心して使えます。
vectorのサイズはあらかじめ調べた上で使うので大丈夫です。
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が返るのは仕様ですか?
とりあえず、C言語からやり直すほうが良いかもしれない。
ポインタの基礎からやり直せ
>>954 mapクラステンプレートの第三引数のdefaultは、less<Key>。
これを!strcmpするcomparatorに代えてはどうか?
strcmp < 0だろ。
>>958 mapの外部で文字列の寿命を管理できるなら別に良いと思うけど・・・
>仕様ですか?
(´-`)…
>>962 それができるなら、そもそも>954みたいな質問しない気がする。
>>960はSTLをよくわかってないまま
突っ込んじゃったな。
>>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]);
}
△std::map<char *, int, Less()> cl_Bufferin;
↓
○std::map<char *, int, Less> cl_Bufferin;
まあどっちでも同じなんだが
>>967 同じじゃないぞ。gccは上のLess()ではエラー。
というか、関数オブジェクトではなくてクラス名を書けって。
969 :
954:2005/05/18(水) 17:54:11
>>968 スマソ。今"Generic Programming"の§8.1.1を見てみたら、そのように
書いてあった。アルゴリズムの比較基準と、テンプレートパラメータに渡す
比較オブジェクトは違うのね。また、叙述関数(boolを返す関数)の場合
でも()は付けちゃだめなのね。
Borlandの糞コンパイラは上の形式でもエラーなしで通すので勘違いしてた。
つか、何処指してんだか信用できない char * を
キーにするのってどうよ?
若気の至りです
>>968 どうでも良いが、Less()はその文脈では「Lessを返す無引数関数」。
Lesson1()
975 :
デフォルトの名無しさん:2005/05/19(木) 23:55:44
ちゅーかさ、俺がほしいのはSTLじゃなくて、
STLにもう1階層かぶせたぐらいのものが欲しいんだよね。
ローカルでちょっと使う場面だとそのまんま使ってるけど、
〜の要素を増やしてとか減らしてとか取得してとか設定してとかやってると
どうしてもラッパー作っちゃうよね?
そうなるとvectorやlistも別にあってもなくてもいいかなぁ・・・とか考えちゃったりしてw
(会社じゃ覚えてる人少ないからむやみに使えないしね)
ローカルでちょっと使う場面だとそのまんま使ってるけど、
何か変換かけるたんびに一度固定長の配列に移してstr***系の関数に
ぶち込まなきゃならないからそこが面倒でたまんないよね?
そうなるとstringも別にあってもなくても(略w
vector使わずにC++やってる会社って……
微温湯の温さに合わせていると、上がったときに風邪引くぞ。
「ローカルでちょっと使う場面」とか、
「何か変換かけるたんびに」とか、
言っている意味がわからん
>微温湯の温さに合わせていると、上がったときに風邪引くぞ。
誰か日本語に翻訳お願いします。
>>978 身近の馬鹿に合わせて自分のレベルを落とすな、ってコトでしょ。
>>977 その辺りは想像力で補間してやらないと、行数が異常に増えてしまって2chでの会話は厳しい
そんなの余計なお世話じゃないの?
>>980 まずは書く側がまともな短文書くのが先だな。この場合元の文が壊れすぎだ。
&vec[0] とか c_str() とか使えばいいのにな。
ただ巨大なstring作って write(fd,s.c_str(),s.size());とかcout << s ;
とかしてやったら内容ちょろっと壊れてるのな。ヒギィ
STLをフルに使ったプログラムで
うまくいった例ってあるの?
ほどほどに使うor足元を固める
くらいの使い方でいいんだよね?
エディタとしては成功してないな
>>986 例えば、
stringで保持している文字列の中の特定の文字列を別の文字列に置換する
って一度固定長の配列に移さなくても処理できるの?
c_str使っても文字列に変換かけるときって、固定長の配列にいちいち移さなくちゃできないでしょ?
>>991 それは std::string の実装方法によるだろ。c_str()は const char* なので、
多くの実装が std::string の内部をそのまま返している(つまり、最後には
初めから '\0' が入れられている)ようだが。STLportなどのソースを読んで
みると勉強になるよ。
>>991 char *で処理しないといけないわけでもあるのか?
>>991 find_xxx_of()
replace()
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
愛
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。