【C++】STL(Standard Template Library)相談室
139 :
デフォルトの名無しさん :
04/10/01 21:38:12 wstringからstringの変換をしたいのですが、 以下の???に何をいれたらいいのかわかりません。 MicroSoftによると、inメソッドの定義は次のようです。 <MicroSoftの説明> result codecvt::in(State& state, const To *first1, const To *last1, const To *next1, From *first2, From *last2, From *next2); しかし、first1は何かとか、last1が何かとか具体的な説明がないため、 わかりません。 以下のコードの、???の部分に何を入れたらいいのかご教授お願いします。 int main(int argc, char* argv[]) { codecvt<wchar_t, char, mbstate_t> strcvt; mbstate_t stateObj; string str; wstring wstr = L"あしたは晴れだ"; strcvt.in(???); return 0; }
>>139 ↓MSDNのサンプル
char* pszExt = "This is the string to be converted!";
wchar_t pwszInt [LEN+1];
memset(&pwszInt[0], 0, (sizeof(wchar_t))*(LEN+1));
char* pszNext;
wchar_t* pwszNext;
mbstate_t state;
locale loc("C");//English_Britain");//German_Germany
int res = use_facet<codecvt<wchar_t, char, mbstate_t> >
( loc ).in( state,
pszExt, &pszExt[strlen(pszExt)], pszNext,
pwszInt, &pwszInt[strlen(pszExt)], pwszNext );
pwszInt[strlen(pszExt)] = 0;
wcout << ( (res!=codecvt_base::error) ? L"It worked! " : L"It didn't work! " )
<< L"The converted string is:\n ["
<< &pwszInt[0]
<< L"]" << endl;
exit(-1);
142 :
デフォルトの名無しさん :04/10/01 23:18:18
DirectShowフィルタを書いてるんですがそのなかでvectorを使うと次のようなエラーが出てしまいます。 どうすればよいかご存知の方いますか? C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\xstring(527) : error C2059: 構文エラー : 'catch' C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\xstring(521): クラス テンプレートのメンバ関数 'void __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Copy(unsigned int)' のコンパイル中 C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\xstring(527) : error C2143: 構文エラー : ';' が '{' の前に必要です。
書き忘れましたがVC++6.0です。
144 :
>>139 :04/10/02 00:20:27
>>141 ひょえ〜〜〜〜〜〜
難しすぎ!!
wstringからstringに変換するだけでこんなにコード書かなきゃいけないのか・・・・
こんなのをイメージしてたのにぃ・・・・
string = "あしたははれだ";
wstring wstr = codecvt.wstringTOstring(str);
>>144 一見難しく見えるが、一番最初にくっついてるのは変数の初期化だし、
一番最後にくっついてるのは結果出力だし。
肝の部分は
use_facet<codecvt<wchar_t, char, mbstate_t> >
( loc ).in( state,
pszExt, &pszExt[strlen(pszExt)], pszNext,
pwszInt, &pwszInt[strlen(pszExt)], pwszNext );
だな。
codecvt は直接インスタンスを生成できないから。
use_facet( locale ) を使って取得しないといけない。
だからgccのサンプル見ろって。 MSDNのサンプルは質の低いのが多いから。 (多くをアルバイトが書いているらしい) wstringstream使えな。
MSのはサンプル以前にSTL自体の質が・・・。
MSに質を求める方が間違ってる
最新の奴はいけてるんでしょ。VC++って。 特にライブラリはプラウガがやってるしなあ。 100%適合の数少ない一つでしょ、ダンキンのライブラリ。
VC++ 6.0まではいまいちだったけど
今時VC++の質を叩いている奴は、 使えないロートルだな。
>>144 素直にVCのマクロ使えば?
USES_CONVERSION;
MessageBoxA( W2A(L"今日はあめだ") );
>>153 結論からいけばそうだろうけど
でも彼はcodecvを使ってやりたかったのでしょう。
>>138 スレ違いで申し訳ないのですが、よかったらでいいのですが、
そういった記事(情報)はどうやって得るのか教えていただけないですか?
MSDNのホットトピックが配信されるようなMSのMLみたいなものがあるのですか?
>>144 こういうのはどうか?
#include <windows.h>
#include <string>
std::wstring to_wstring(const std::string& str) {
std::wstring wstr;
unsigned BufLen = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), NULL, 0) + 1;
wstr.resize(BufLen);
MultiByteToWideChar(0, 0, str.c_str(), str.length(), &wstr[0], BufLen);
return wstr;
}
イメージ通りに使えるぞ。
#include <iostream>
using namespace std;
int main() {
string str = "hogehoge";
wcout << to_wstring(str) << endl;
return 0;
}
#include <windows.h> #include <string> std::wstring to_wstring(const std::string& str) { vector<wchar_t> buf(MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), NULL, 0) + 1); MultiByteToWideChar(0, 0, str.c_str(), str.length(), &buf[0], buf.size()); return std::wstring(buf.begin(), buf.end()); }
mapで確保されるメモリ容量はどう計算したらいいでしょうか? たとえば、 map<char,char>でN個のデータを確保した場合、2*N byteでいいですか? どうも使用メモリ量が予想よりも多い気がします。
>>158 そんなもん実装次第だがポインタ1個分は加わるだろ
>>159 pointerだから1個につき4バイトですかね。漏れの場合は予想より3倍近くいってるのでびっくりしたわけです。
実装がまずいのかな。ちょっと見直してみます。
うん、まずいな。
内部実装がRB-Treeだとすると,各ノード当たり ポインタ3つ(左右の子と親)と色のenumが余計に付いていると 予想するのが妥当ですかね?ま,実装読めば良い話なんですが.
>>163 RB-Treeの場合、色をポインタに埋め込んで持っていて
領域を特別確保していないことが多いとよく聞く。少なくとも
手元の実装ではそうなっていた。
>>164 ( ・∀・)つ〃∩ ヘェーヘェーヘェー.っていうか良くやる手ですよね.
VC++7.1ではポインタ3つ+char2つ余分に付いてました.
とりあえず最低限ポインタ3つ(iteratorの実装のために親へのポインタも不可避なはず)
は余分に使うってことですね.
166 :
デフォルトの名無しさん :04/10/03 22:00:58
>>158 sizeof関数で取得できます。
例えばintなら、
int i;
sizeof(i);
> sizeof関数 > sizeof関数 > sizeof関数
sizeof int
return関数みたいなもんじゃないの?
> return関数 > return関数 > return関数
似たような奴で、C++では新しく typeid関数 throw関数 とかも増えたんだろうな。
if関数はいいんだけど、for関数とかdo-while関数ってなんか文法的におかしいよね。
ネタはマ板でやってくんないかなあ・・・
>>156 stringはvectorと違って、メモリレイアウトは配列コンパチじゃないぞ
>>175 そりゃ知らなかった。
#include <windows.h>
#include <string>
std::wstring to_wstring(const std::string& str) {
unsigned BufSize = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), NULL, 0) + 1;
PWSTR wpszBuf = new WCHAR[BufSize];
MultiByteToWideChar(0, 0, str.c_str(), str.length(), wpszBuf, BufSize);
std::wstring wstr(wpszBuf);
delete[] wpszBuf;
return std::wstring(wstr);
}
#include <windows.h> #include <string> std::wstring to_wstring(const std::string str) { vector<wchar_t> buf(MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), NULL, 0) + 1); MultiByteToWideChar(0, 0, str.c_str(), str.length(), &buf[0], buf.size()); return std::wstring(buf.begin(), buf.end()); }
>>175 配列互換じゃないなら、basic_string::data()をどう説明するの?
具体的に、シリアルになってない実装のSTLとかあるの?
(・∀・)ニヤニヤ
>178 より正確に表現するなら「配列互換であることが標準のどこにも保証されていない」. 実際,シリアルになっていない実装は少ないと思いますが, それはあくまで多くの実装が「たまたま」シリアルな実装になっているだけでしょう. ベンダの裁量次第では例えば配列互換でない実装をしておいて,data()が呼ばれたときに シリアルに再配置してその先頭ポインタを返す,なんて実装をされていても 文句は言えないということです.
ropeを使ってbasic_stringを実装していると、
>>179 > data()が呼ばれたときにシリアルに再配置してその先頭ポインタを返す,
となるね。
http://www.sgi.com/tech/stl/Rope.html const charT* c_str() const
Returns a pointer to a null-terminated sequence of characters
that contains all of the characters in a rope. [5] [6] The
resulting sequence of characters is valid at least as long as
the rope remains valid and unchanged. Note that the first
invocation of this operation on long strings is slow: it is
linear in the length of the rope.
シリアル配置したコピーバッファをc_str(), data()関数で提供しつつ、 内部で断片化されたデータを使い続けるような2度手間な実装だったら、ある意味凄い。 ・・・つか、イラネ。
stringは、resize()でヌルセットされる実装である点なども考慮して MFCのCStringみたいに生バッファアクセスを許可して欲しいところだ。 最大の問題はreserve()がVCとgccで挙動が違うところだと思う。
>>178 「規格に関係なく書いたコードでも動けばよい」というような
態度は周りが迷惑する。
>>183 迷惑ってんなら、「規格」も周りに迷惑をかけまくってるだろ。
とりあえず、論より証拠で不具合が発生するSTLベンダ名をうpしてくれ。あるんだろ?
話はそれから。
複数のインスタンスから参照されるアドレスを上書きと問題が起こるのは既知だけどな。
参照カウンタを自力でリセットしてから
>>156 のようにやるのは、なかば常識だろ。
>>184 君の論法は「国の法律は俺にとっては都合が悪いからどんどん変えてくれ」
と言っているのと全く同じだね。
(・∀・)ニヤニヤ
>>189 おやおや姦国人ですか?日本語が読めないとは。
どうでもいいからさ、不具合のあるSTL挙げてくれよ(プゲラ
実際に体験したからご立派なこと言ってんだよね?
>>178 ちゃんと報告して下さいね(プゲラ
(プゲラ (プゲラ (プゲラ
vector以外はシリアルな実装になっていると保障されていないので vector以外を C API に直接渡したり、直にバッファをいじったりするコードは 移植性が下がる
哀れすぎる
ISO規格ではvectorも保証されてないだろ。 現在時期C++に向けての修正案で保証するべきという用件があがっているだけで。
1つのサイズがわずか1or2バイトであるstringの連続性が保証されず、 サイズが可変であるvectorの連続性が保証されるというのも不思議な話だ。
199 :
デフォルトの名無しさん :04/10/08 23:59:39
はぁ?
何不明
1つのサイズがわずか1or2バイト 1つのサイズがわずか1or2バイト 1つのサイズがわずか1or2バイト
>>198 T array[N]; の連続性も不思議だと思うのかな。
>>203 オタク臭い文章・・・。やはりC++ユーザーってちょっとアレだな
>204 自分でもそう思いますw
206 :
デフォルトの名無しさん :04/10/09 01:27:49
Ruby >>>>>>>>>>>>>>>>>>>>>>> C++=臭いオタク寄るな
なぜ素直に「そうだったんですか。知りませんでした」
と言えないんだ
>>204 のオタクは
騙り臭いし
listやvectorに対するrbegin/rendって標準でしたっけ。
・・・ですね。 rbeginでとったiterator経由でeraseしようとしても失敗しちゃうのは仕様 ッスかね? list<int> mylist; mylist.push_back(1); mylist.push_back(2); mylist.push_back(3); itr = mylist.rbegin(); mylist.erase(itr); // コンパイルエラー
仕様
>>211 rbegin()で返ってくるのはreverse_iteratorであってiteratorじゃない。
>>211 後ろ消したいんだったら空でないこと確かめて
list <int>::iterator itr (-- mylist.rbegin().base ());
か
list <int>::iterator itr (-- mylist.end ());
か pop_back (本題と外れてるけど)
嘘を教えてる人がいるYO。
嘘教えちゃいけないっていう法律でもあるの?
偽証罪に問われるよ
へえw
なんでiteratorとreverse_iteratorって同一の抽象クラスを持ってないのかな
Effective STL
を見ろ。
っていうのは冗談。
なんちゃって。
ごめん
>>218 恥ずかしい奴だなあ。偽証罪って裁判所内でしか関係ないぞ。
ネタニマジレスハズカシイ
ネタがつまらなすぎる
>>230 全くの板違いだが気になったので。
国会の証人喚問は法廷並みの扱いなので
ここでの嘘は偽証罪に問われる。
疑惑の政治家が証人喚問に呼ばれるのは
「記者会見で言ったことがここでも言える?
嘘だったら警察に捕まるよ〜ん」ってこと。
>>231 その話がSTLとどういう関係があるのか?
234 :
デフォルトの名無しさん :04/10/17 18:52:34
1引数ファンクタを0引数ファンクタに落とすクラスは標準にないでしょうか? 2引数を1引数にするにはbind1stとかを使えばいいのですが。 別に自作してもたいした手間ではないのですがなんか・・・
自作してもたいした手間ではないものほど標準であって欲しい
>>234 ごめん。
クラスね。unary_functionがある。でも、生成関数はない。
非標準ならboost::bind,boost::lambda::bindとかが使えるかな. あ,でもここSTLスレだった・・・.
unary_functionとbiary_functionの型パラメータは なんで最後が戻り値の型なんでしょう 最初にあった方が直感的だと思うけど・・・
仕様決めた人間に聞け
>>239 俺もそう思た
確かLokiでは最初に戻値型があったような
センスがなかったんだな。きっと。
そこでキーワード引数ですよ。
そこで、じゃないだろ もともと順序性あるのにわざわざキーワードにマップする意味なし
順序性あるか? たまたまC++の構文がそうなっているだけのような気がするが。
見た目の順序のことを言っているだけだが?
だけだが?
けだが?
だが?
ガッ!
const char dakedaga[] = "だけだが?"; for (int i = 0; i < 3; ++i) std::cout << dakedaga + 247 + 2 * i << std::endl;
252 :
デフォルトの名無しさん :04/10/27 00:27:57
std::vector<int> vecint; のすべての要素と和はかっこよくかけませんかね? forで回すのは無しねw
int total = std::accumulate(vecint.begin(), vecint.end(), 0);
struct sum { int m_sum; sum() : m_sum(0) {} void operator()(int n) { m_sum += n; } }; として { sum s; std::for_each(vecint.begin(), vecint.end(), s); std::cout << "合計:" << s.m_sum; } これでどうや?
255 :
デフォルトの名無しさん :04/10/27 00:43:41
>>253 >>254 ありがとうございます。
どちらもC++らしいかっこいいとおもいます。
ですが、
>>254 さんのはちょっと内容が僕にはヘビーなんで
>>253 さんので以降と思います。
ありがとうございました
一冊でもまともな本を持ってたら そのまんまの記述が見つかるレベルだぞこれ。 ちゃんと本買ったほうがいいんじゃねえか?
>>255 boostでは無名関数が定義されていますので、こういうこともできますよ
int sum = 0;
std::for_each(data.begin(), data.end(), (sum += boost::lambda::_1) );
>>258 確かにスレ違いだけど、STLを使っている人の中にはBOOSTを使う用意の
ある人も多いのではないかと思っている。
そういった人が、STLではこうしているがもっとスマートにはならないだろうか、
と考えた時、BOOSTの中にある選択肢を"たまたま"知らなかったとしたらBOOSTスレ
にそれを聞きに行くだろうか。
知らないものは、聞きにはいかない。
ここでキーワードを教えるくらいは良いと思うけれどね。
てかC++スレ分割しすぎ
>>260 C++は分割して作業しやすいように出来ているからね。
262 :
デフォルトの名無しさん :04/10/27 01:44:16
>>257 無名関数ですか、perlっぽいすがまた、激しくカコイイですね
未だにCライクにループで回す癖が抜けませんw
>>262 もともとはLispのlambda式なんだけどね。
BOOSTのlambdaはちょっと違和感があるけれど。。。
>>259 すれ違いで悪いんですが、Delphiでの解決方法教えてください
>>264 257はありだろうけど
さすがにそれはDelphiスレで聞くべきだよ
(本当に知りたければね)
そういえば結局、次期標準でBoostから採用されるものって何なんだ?
日本語読めないの
>>267 function, tuple, type_traits, regex, mem_fn, shared_ptr, ref, bind
STLportにバグが見つかったそうな。
いっぱいあるだろそんなもん。
STLPortなんてどうして使うの?
STLSoftもつかおーぜ
>>278 そんな怪しい名前のソフトは使いたくねーなw
281 :
デフォルトの名無しさん :04/10/30 02:30:33
std::map<std::string,int> Map; Map.insert(std::pair<std::string,int>(std::string(""),1)); ~~~~~~~~~~~~~~~ の部分をハードコーディングではなく書けませんか?
typedef std::map<std::string,int> OrenoMap; typedef std::pair<std::string,int> OrenoPair; OrenoMap Map; Map.insert(OrenoPair(std::string(""),1));
>>281 typedef std::pair<std::string,int> hoge;
う゛ぁぅえ_tyぺ
>>281 std::pair<>(std::string(""), 1)
ってこと?
286 :
デフォルトの名無しさん :04/10/30 02:42:00
Map[""] = 1;
>>286 ダメだからmake_pairってのが用意されてたりする
>>281 Map.insert(std::make_pair(std::string(""), 1));
古いコンパイラだと受け付けないのもあるかもしれませんが・・・.
typedef std::map<std::string,int> MapT; MapT m; m.insert(MapT::value_type(std::string(""),1));
m.insert(MapT::value_type("",1)); でもOK
こうr
map::insertはkeyが既存の場合,値が変更されません. 287さんのはkeyが既存のものも変更されます. あと,細かいところだと293さんが書かれているの(効率)もあります.
全部EffectiveSTLの受け売りですねぷぷううううううううううううううううううううううううううううう Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>C++
SuperRubyistはEffectiveSTLまで読んだのか
SuperRubyisは勉強熱心だね。
300 :
デフォルトの名無しさん :04/10/30 23:26:32
vector <string> temp; ってやっちゃっていいのでしょうか? なんかVC6だと警告でるのですが・・・。
>>300 警告の内容も晒さずに人様の貴重な時間を浪費して良くそんなことが聞けるな。
vc6は窓から投げ捨てろ
>>300 それは無害です。
E:\Project\Test755\Test755.cpp(16) : warning C4786: 'std::reverse_iterator<......'
: 識別子が '255' 文字に切り捨てられました (debug 情報内)。
304 :
デフォルトの名無しさん :04/10/30 23:36:07
>>301 もうしわけありませんでした。
って、調べてみたら解決しました。
どうやらVCのコンパイラが対応していないだけってことだったらしいです。
#pragma warning(disable:4786)
っというように追加して、みんなやってるようです。
305 :
デフォルトの名無しさん :04/10/30 23:37:06
今更だけど、std::mapより素直に力技のstd::vectorの検索を実装しといた方が柔軟な仕様変更に強いね。 メモリ消費量も断片化しないからstd::vetorは捨てたものじゃない。 当初の予想以上に作り込む必要が出てきたときstd::mapは厳しいね、いろんな意味で。
おいおい… お前の設計段階での抽象化が甘いだけだよ。
>>306 力技の実装が素直なわけないだろ。
「仕様変更に強い」ではなくて、
たまたま実装に都合のいい仕様変更がはいっただけじゃないのか?
特殊なケースを一般的であるかのように言うのは感心できない。
そもそもvectorを代わりに使うならmapじゃなくてmultisetになりそうなもんだが
map<T1, T2>をvector<pair<T1, T2> >にしたのかもしれん
312 :
デフォルトの名無しさん :04/11/01 00:05:15
コンテナ要素が複雑であった場合は結局、諸々の検索方法を実装しなければならず、 std::mapのキー検索の存在感が、かすむ、かすむ。 みんなはどうしてるわけ?mapにおけるキー以外の検索。
>>313 boost::multi_index
ってのはもうちょっと先の話だが、
キー以外の検索があるのなら map に不満が出るのはあたりまえ。
最初っからそう言えよ。
普通に考えて、set<自分で作ったクラス>、だろ。 他に選択肢がありえる理由がわからん。
>>315 less でソートされてる必要は無いから set で保持するのは無駄だろ。
std::vectorで済むものはそうしているし、 駄目なものは他のものを使っている。例えば赤黒木。 いずれにせよ、検索のための"algorithm"をstd::vector専用に書いたりはしない。
>>315 std::setはメモリ消費量が大きいです。無駄多し。vector<list<setです。VC6,VC7で確認済み。
メモリを一括確保できるstd::vector::reserve()がある限り、std::vector最強だと思います。
ちなみに要素をswapしたい場合などは配列を直接移動させることは避けて
これまたポインタ配列やポインタリストを用意して順序付けするようにしてますが。
std::setは論外です。std::setは柔軟性の点で劣るかと。重み付けがかえって邪魔になる事多し。
320 :
デフォルトの名無しさん :04/11/01 00:22:10
ねぇ、おまいらSTLとかなんかよりまずは C++を勉強してこい、話はそれからだな
>>319 ひょっとして、検索が主な用途じゃないのか?
>>319 なんで初めにmapを使ったのか、理由を教えて。
>>319 メモリ消費量の大きさが「無駄」になるかどうかは使う場面ごとに違うだろ。
reserve するためには要素数に対する前提が必要だろ。
繰り返すが、
特殊なケースを一般的であるかのように言うのは感心できない。
>>322 実は、自分のPCに数十万のファイルがあってファイルを探すのが面倒なので
ファイル名だけでフルパス名を取得できる仕組みを作ってたのですが、
ファイル名をキーにして、ファイルのフルパス名・その他情報を値としてstd::mapを構成していたのですが、
色気を出してワイルドカード検索できるようにしようとした時点でstd::mapによる設計が形骸化しました。
現在そのプログラムはバックグラウンドで動かすサーバ形式をとっているのですが、
ファイルが数十万なので常駐メモリが100MBを超えています。(※意図的なものです。)
ギガクラスのメモリを乗せる時代に見合ったファイルインデックスシステムがあってもいいかな、と。
ゲームやVMでしかメモリをフル稼働しないのは勿体ない気がしたこともありまして。
325 :
デフォルトの名無しさん :04/11/01 00:42:16
setでinsertしまくると遅い事に気づいたんだけどうまい方法無い? 挿入するまとまりを、 vectorに一旦入れてからset.insert(vec.begin(), vec.end())みたいな感じで まるごとinsertしてみたけど意味無かった。
[cppll:5647] ソート済みベクタは遅い? これ見てからはもっぱらソース済みvectorは使わなくなったな。
>>323 自分の経験則からいくと、vector::reserveの冗長性を織り込んだメモリ消費量より、
std::listやstd::set,std::mapのメモリ断片化によるメモリ消費量の肥大化の方が厄介でした。
多くの場合、要素数のおおよその数が分かっているので、したがってvectorが最適である可能性が高い。
しかも、そのサイズに関する最適化の効果を確実に得られるのもvectorの特徴。
他のコンテナではPGによる最適化の手段が限られている。
>要素数のおおよその数 予想も付かない場合が多い。
vectorはPGが要素数を教えて上げないと極端に遅くなるか 極端にメモリが無駄になるかのどちらかになるから。 vector以外のコンテナはそんな事は無い。
つかそこまでいったらUNIX DBとかsqliteぐらい使えよ。
>>328 要素数が多くて、さらに、その数が予め解かってる場合は、
vectorがいいですね、そうですね、そうですよ。
>>329 さっきからstd::setを賞賛する痛い人と同一人物ですか?
同一人物でしたら残念ですが同意できません。
別人でしたら同意します。やっぱこういうのは、ケースバイケースですから。
>>326 ソース済みvector(・∀・)イイ!
>>333 setを薦めてるレスは
>>315 だけじゃない?
それも要素数の話が出る前の検索用コンテナの話題で。
俺も306なら不同意だけど、他なら同意だ。 ケースバイケースだからな。
ぶっちゃけ、
>>324 で述べた仕様が、
Unixにおけるlocate・slocateコマンドをメモリ常駐バージョン化して毛が生えた
他愛のないものであることは十分承知してます。でも作ってしまったものはしょうがない。orz
検索するインデックスキーがある程度決まってる場合は setがいいよ。 [cppll:5687]から転載 3000ms - set<int> set::lower_bound 3203ms - set<int> set::find 4188ms - vector<int> lower_bound 4547ms - vector<int> binary_search 4719ms - vector<int> equal_range 5109ms - set<int> set::count VC7+付属STL 要素数1000 ヒット率50% ループ回数 1千万 10125ms - set<string> set::find 11265ms - set<string> set::lower_bound 13250ms - vector<string> binary_search 15078ms - vector<string> lower_bound 17297ms - set<string> set::count 17328ms - vector<string> equal_range 検索するインデックスキーが全然決まってない場合は 要素数が分かってる場合…vector 分からない場合…deque がいいよ。
やっぱ言葉足らずな人が出ると盛り上がるな。
>>328 vector は reserve が使える。それだけ憶えとけば十分。
そんな経験則、実際の判断に勘定するべきではない。
> メモリ断片化によるメモリ消費量の肥大化
ほんとで「断片化」が原因だったのか、怪しい言い回しだな。
邪道だが、std::vectorをqsort()でソートすると効率が大幅に改善するから使ってる。 qsort(&v[0], v.size(), sizeof(v::reference_type), comp_func); というか、なぜvector::sort()はあんなに遅いのだろうか・・・。 vector::stable_sort()は現在順序を反映してくれるので許せるが。
STLにvector::sort()なんて存在しません
>>343 失礼。訂正。
vector::sort() → std::sort()
vector::stable_sort() → std::stable_sort()
Celeron 1GHz, mem 256MB, VC++7.1で実験 int 1000000個を持ったvectorのソート 最適化なし qsort 1.9s sort 6.2s 最適化あり qsort 1.1s sort 0.8s 最適化してなかったとかいうオチだったらヌッコロス
>>345 ちゃんと文字列を入れたstringで試してみ
348 :
デフォルトの名無しさん :04/11/01 03:27:54
おまいら部分ソートってのしらないの?
なんで部分ソートが出てくるの?
partial_sort()を使ってどうする。この場合。
某スレで出たstringでの比較用コード #include <stdlib.h> #include <stdio.h> #include <algorithm> #include <windows.h> #include <string> int compare(const void* a, const void* b) { return strcmp(((std::string*)a)->c_str(), ((std::string*)b)->c_str()); } struct Compare : public std::binary_function<const std::string&, const std::string&, bool> { inline bool operator ()(const std::string& a, const std::string& b) const { return strcmp(a.c_str(), b.c_str()) < 0; } }; const int ssize = 1000000; main() { std::string *s = new std::string[ssize]; for(int i=0;i<ssize;i++) { for(int i=0;i<16;i++) { s[i] += char(rand() % 26 + 'a'); } } DWORD t = GetTickCount(); //qsort(s, ssize, sizeof(std::string), compare); //std::sort(s, s+ssize, Compare()) std::sort(s, s+ssize); printf("%dms\n", GetTickCount()-t); delete[] s; }
>>351 VC++7.1 -O2 -GX
qsort
201ms
std::sort(Compare())
511ms
std::sort
481ms
>>351 for(int i=0;i<16;i++)
はjにしなきゃ。
>>351 std::sort()の方はコンストラクタ・デストラクタ・コピーコンストラクタ・代入演算子
が頻繁に使われてしまうから、これではまともな比較ができん。
jに直した物 VC++7.1 -O2 -GX qsort 4256ms std::sort(Compare()) 5116ms std::sort 6960ms
std::sortって コンストラクタ・デストラクタ・コピーコンストラクタ・代入演算子を 定義し直さないといけないのか。 使うの面倒だな
std::stringにはswap()メンバ関数があるから、それを活用して特殊化した sort()が必要そうだな。どちらにしろqsort()は動かない処理系はまずない だろうが、危険な香りがプンプンする。
いや,stringに対して自由関数のswapが特殊化されているのは 標準で明記されていますよ.だから,sortはこのswapを使うはず. なので,上のようなoverheadの由来がよく分かりません. どこに原因があるのか知りたいです.(sortの実装詳細?)
>>359 標準のstd::sort()はstd::stringに対してswapを使うと明記されてるの?
初耳だが。STLport4.6.2を調べてみたが、特殊化されている気配はない。
std::stringの場合はsort()を自作した方がいいんじゃないの?そんなに
速度の低下が気になるなら。
組込型をソートするならstd::sort クラス・構造体をソートする時はqsort と使い分けるのが良さそうだな。
Effective STLは嘘つきだな
>>362 何項が怪しいと思うんだ?ちなみに聞いてみるが。
読み直してみたら可能性が高いとかいう書き方で逃げてやがった
>>355 はVC7.1に附属しているDinkumwareのSTLを使っているのか。
STLport4.6.2で実行してみるとご覧の通りの結果になった。
環境AthlonXP3000+、PC2700 1GB、XPSP1
VC7.1+STLport4.6.2(Buildモード)
qsort
63ms
std::sort(Compare())
1203ms
std::sort
1562ms
もしかしたらDinkumwareの方はswap()を使って特殊化しているのかも
知れないな。qsort()があまりに速すぎる。
366 :
デフォルトの名無しさん :04/11/01 05:35:02
std::sortは 特定のクラス専用に作られた swap 関数 (例えば inline void swap( Foo& a, Foo &b);) を使ってくれないんですか?
>>366 残念ながらテンプレート・パラメータとしてswap関数を与えるバージョンは
標準にはない。君が作ってくれ。
>>366 CodeWarrior付属のSTLはちゃんと使う。std::stringを扱う場合も
インライン展開されるstd::sortの方がqsortよりずっと速い。
std::sortが遅いのはVC++処理系固有の問題、御愁傷様
>351 qsortは一回の比較につきless, eq, greaterの情報を取得できるのに、 std::sortだとlessとgeqの情報しか取得できないじゃん。 にも関わらずstrcmp()使ってるから比較にかかる時間は同じ。 こんなファンクタ書かれたら明らかにstd::sortが遅くなるに決まってる。
>>369 stable sortなら算術比較が有効な場合もあるけどなあ。
string に qsort って、未定義だろ。 string::swap() は規格に載ってる。 sort が swap 使っていいかどうかは不明。
stringをmemcpy(3)しちゃうわけだもんね。
>>372 stringにqsortして動かなくなる実装があったら教えて
>>368 gcc3.3.4
gcc3.4.2
bcc5.6.4
で試したら全部qsortの方が速かったよ。
結論…CodeWarriorは最強
g++(mingw) 3.3.3 -O2 qsort 4336ms std::sort(Compare()) 7000ms std::sort 7631ms
bcc32 5.6.4 -O2 (元スレから拾ってきた) qsort:1963ms std::sort(Compare()):2673ms std::sort:3395ms
CodeWarriorには全米が泣いた
mingw - g++ 3.4.2 -O2 @ AMD Duron1.2GHz qsort 50ms std::sort(Compare()) 1713ms std::sort 2053ms qsort速いね..
私のおじいさんが教えてくれた、初めてのC++言語実装。 それはCodeWarriorで、私は4歳でした。 その味は甘くてクリーミーで、こんな素晴らしい実装を教えてもらえる私は、 きっと特別な存在なのだと感じました。 今では、私がおじいさん。 孫に教えてあげるのは、もちろんCodeWarrior。 なぜなら、彼もまた特別な存在だからです。
>>378 BCCのqsortそんなに遅かったか?
BCC5.6.4 -O2 -vi
AthlonXP3000+ 1GB XPSP1
qsort:78ms
std::sort(Compare()):1218ms
std::sort:1437ms
これは交換を行う演算子があったほうがよかったかもしれんね。 swap関数では言語的に統制されたインターフェースとしては弱い。 int a, b; a @= b; // aとbを交換するトカ
a <=> bの方が直感的
ヌッコロされるべきは
>>345 だったというオチか。
セレロンユーザの分際で粋がるとああなるっていう典型だな(藁
386 :
デフォルトの名無しさん :04/11/01 11:10:12
>>345 晒しあげw
セレロン使いのおこちゃまが夜更かししちゃ駄目だぞ。
漏れは鱈セレ使いと河童セレ使いは違いの分かる香具師だと信じている。 藁セレ使いはアフォ北森以降セレ使いは貧乏
当方 gcc(g++) ですが <algorithm> からたどってヘッダを見てみたら inline void iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) 〜 中略 〜 const _ValueType1 __tmp = *__a; ←ココ *__a = *__b; ←ココ *__b = __tmp; ←ココ (!? 直接代入してるよ!)ここを swap( *__a, *__b); に変えてみたら std::string で定義されてる inline void swap( string &... が利いたのか、 std::sort(変更前) 2033ms std::sort(変更後) 1312ms へと 高速になりました。swap( *__a, *__b) では何かまずいんでしょうか…?ただのバグ?
結果がおかしくなるわけじゃないんだからバグではないだろう
bcc5.6.4とかで標準のstlportでは 初めから // swap and iter_swap template <class _Tp> inline void swap(_Tp& __a, _Tp& __b) { _Tp __tmp = __a; __a = __b; __b = __tmp; } template <class _ForwardIter1, class _ForwardIter2> inline void iter_swap(_ForwardIter1 __i1, _ForwardIter2 __i2) { swap(*__i1, *__i2); } となっている
>>390 VC++7.1のDinkumwareもそうなってる
GNU側のミスっぽいな
それでも結局qsortの方が全然速いのでした。 −完−
STLスレに来てるんだから遅くったってstd::sort使えよ。 ビヤーンが泣くぞ
qsortのqは速いって意味だ。 ただのsortより速いに決まっているであろう
qsortより速いCodeWarriorはネ申だな。どうなってるのやら。
2010年にはC++の実装はCodeWarriorしか残ってないかもな
これはもうCodeWarriorの単独スレ立てるしか無いな
CodeWarriorのヘッダソースだけもらってきて(以下ry
同じソースコードから各開発環境で生成した実行ファイルを同一OS・同一PC上で比較しなければだめでしょ。 CodeWarriorの最適化が甘いという落とし穴がないとは限らない。 どうするよ?CodeWarriorのqsortがVC7.1のstd::sortに負けてたら。 そんなわけで、CodeWarriorとVC7.1両方使えるユーザは同じコードを使ってVC7.1バージョンと比較してみて。
仕様の話しよう
403 :
デフォルトの名無しさん :04/11/01 15:21:33
qsortが極端に遅くなるサンプル。 (マイクロソフト、ボーランドのコンパイラでは確認したが他のコンパイラでは 試していない。) #include <stdlib.h> #include <stdio.h> #include <algorithm> #include <windows.h> int mycmp(const void* a,const void* b){ return *(int*)a-*(int*)b; } int main() { int i,k,*a; printf("k="); scanf("%d",&k); a=new int[4*k]; for(i=0;i<k;i++){ a[2*i]=2*i+1; a[2*i+1]=2*k+2*i+1; a[2*k+i]=2*i+2; a[3*k+i]=2*k+2*i+2; } DWORD t = GetTickCount(); qsort(a, 4*k, sizeof(int), mycmp); //std::sort(a,a+4*k); printf("%dms\n", GetTickCount()-t); delete[] a; return 0; }
>>403 クイックソートに不向きな順序付けの実装ですね。
ただ、今争点になっているのはコンテナのswap()のコストに関してなので、少し違うかも。
このスレには司会者がいたのですね。 なかなか格調高いスレですね。
>>400 両方使えるが、どのソースを使ったらいいんだい?
てか
>>361 みたいな感じで使い分ければいくない?
>>351 のコード(jに直したver)
ただし、コンパイルエラーが出たからmain()の戻り値にintを
指定してあるのと、#include <functional>を追加してある。
Metrowerks CodeWarrior 8.2 Pro オプション:最大(スピード優先)
qsort 5282ms
std::sort(Compare()) 1922ms
std::sort 3109ms
MS cl ver 13.10.3077 オプション:-O2 -GX
qsort 2296ms
std::sort(Compare()) 2312ms
std::sort 3703ms
やっぱCodeWarriorのqsortが遅いだけというオチだったな。
CodeWarriorのstd::sort(Compare())なかなか早いね。 MS clもstlportを使えばもっと早くなるんじゃないかな。
Metrowerks Template Libraryのqsort.cより *Implementation *-------------- *Here we use Heapsort, after Knuth's "The Art of Computer Programming, Vol. 3", *Section 5.2.3. Heapsort was chosen because it requires no auxiliary storage and *has excellent average *and* worst-case performance.
今日、久しぶりに部屋の掃除をしたらウジの死骸を 見つけた。どうりで最近子バエがよく飛んでると思った。 その話を踏まえて 例え時間が最短でも楽をすると痛い目に会うということだね。
あーはいはいうまいうまい ↓次の方どーぞー
ふいんき同然のバカ出現。
しゅみれーしょん
ちょいと質問です vectorなどのコンテナを利用し、 サイズの大きい構造体(Hoge)を動的にデータを格納する場合 vector<Hoge> よりも vector<Hoge*> の方がオーバーヘッドが少ないと聞きました で、実際その方法でやってみたわけなんですが、 この方法だと結局自分でメモリ確保して解放する手間が出てきて コンテナ利用する利点が失われるのでは、と思ったわけで… 本当にオーバーヘッドが大きいのでしょうか? それとこの方法で、コンテナを利用するのはごく普通なことなんでしょうか? auto_ptr 使えとかは無しでお願いします
てか自分でベンチ取ればいいじゃん。
>>418 vector<Hoge> → vector<Hoge*>
+ 要素の追加時に起こる O(n) のコピーが軽い
これは明らかな利点。
「オーバーヘッド」とか言ってる奴はたぶんこれを指してる。
- 寿命管理の必要がある
shared_ptr 使えば回避できる。
ただし、その場合は一つ目の利点を再検証してみたほうがいいだろう。
- アクセス速度はほとんど変わらないだろうが、厳密には遅くなっている
よっぽどシビアな環境でなければ無視してかまわないはず。
? 要素それぞれでメモリ確保するので使用メモリが増える可能性がある(減る可能性もある)
もともと Hoge のサイズが大きいなら、これも無視できるかも。
ポインタだと間接参照になるから vectorの恩恵(メモリ上で連続しているためアクセス速度が速い)が受けられない。
>>418 > vectorなどのコンテナを利用し、
> サイズの大きい構造体(Hoge)を動的にデータを格納する場合
> vector<Hoge> よりも vector<Hoge*> の方がオーバーヘッドが少ないと聞きました
言っている意味を説明しろ。>オバーヘッド
vector<T*>だとポインタサイズ×要素数メモリ消費が増えるね。
>+ 要素の追加時に起こる O(n) のコピーが軽い >これは明らかな利点。 >「オーバーヘッド」とか言ってる奴はたぶんこれを指してる。 何この人RVOも知らないの?
実データとポインタ配列を両方とも併用するという発想はでてこないのだろうか? いつから二者択一するという前提になったのだろう?
>>424 capacity超えて再確保し直す時の話じゃないの?
RVOが関係するのか。 俺のC++理解度もまだまだだなぁ(pgr
>>424 どこに Return Value Optimization の出番が?
>>429 424はまったく話が理解できてないだけだよ。
つまり Hoge* でコンテナを作れば、 コンテナ数の増減やコンテナのコピーは早いが、 実データにアクセスするにはロスが生じる という解釈でよろしいでしょうか? 結局、Hoge で行った方がいいみたいですね いろいろ返答ありがとうございました
よほどクリティカルでなければHogeでいいんじゃない クリチカルなら面倒なことに手を入れなきゃなんないだろうけど
>>431 >実データにアクセスするにはロスが生じる
・・・文章ちゃんと読めてる?
ま、知ったかぶりの
>>421 が諸悪の根源なわけだが。
>>421 は悪意をもった初心者だ。気をつけろ。
439 :
デフォルトの名無しさん :04/11/02 10:41:04
>>421 がC/C++歴半年以下なら回答者を偽装したアフォとして許すが、
半年以上でかつシラフなのであればPGをやめるべきだろう。
だれか肩たたいてやれ。
でかいvectorをiteratorで叩くなら、
>>421 の言っていることも嘘ではないぜ?
>>440 「iteratorで叩く」とはどういう意味?
初めて聞いた。英語だとどう表現するの?
演算子つくるのめんどいのでノータイムでnoncopyable&shared_ptr
パフォーマンスの話は一般論が出たとこで終わり。 きちんと計測してから出直して来い。
std::sortにstd::stringを適用した場合qsort()よりも遅くなる事にどうしても
納得できず、自分でクイックソート関数を起こしてみた。
ソース
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=321 環境
AthlonXP3000+、PC2700 1GB、XPSP1、VC7.1(Release)
結果
1703ms // 自前qsort版
4953ms // 通常版
2656ms // swap版
swap()を使えばコピーコンストラクタなどの副作用を最小限に抑える事が
できるので、速度が向上したと思われる。しかしmemcpyを使う版にはどうし
てもかなわない。
結論を言うと、stringの中身の長さが同じであればqsort()を使用し、通常
多いと思われるstringの中身の長さがまちまちであればstd::sort()を使う
のが良いと思われる。std::sort()はstd::stringが使われたらswap()によって
特殊化したテンプレート関数を起こすように設計されているとかなりの効率
の向上が期待できそうだ。以上。
追記。stringには比較演算子がオーバーロードされているが、このように c_str()を使ってstrcmp()による比較を用いた方がVC7.1の場合は速くなった。
失礼。
>>444 ×コピーコンストラクタなどの副作用
○代入演算子のオーバーヘッド
>>444 stringは中身の長さが異なってもクラス自体の大きさは一緒の処理系が
多いぞ。しかしそれに依存したプログラムを書くと移植性が無くなってしまう
けどな。
しかし標準C++ではsizeof(std::string)は取得可能のはずだから、固定長と 言う事でいいんじゃないの?
std::sortのswap相当部分をmemcpyにしたのが一番速い?
>>447 そもそも中身の大きさに応じて自身のサイズを変えるなんて出来るのか?
型がちがくなっちまわないか?
>>447 確かに。
gccのstd::stringはsizeof(std::string)が4バイト。
アフォばっかだな
データの入れ替えでmemcpyを使って問題が発生する可能性って無いよね? と思ったけど、thisをメンバに持ってるとか、そんなことやってる場合も多々あるな。
>>453 自分では何も書かないくせにアフォ言う権利ないよ。
型のサイズが変動する事なんて有り得ないって言うC++の基本が分かってないんだもの
>>454 そういう代物を複数用意して配列にセットする状況があるかどうかだが、・・・実際あるのかね?
リンクリストを車輪再発明したアフォクラスならありうるとは思うのだけど。
stringでも参照カウンタと他要素のthis持ったりするよね。
>>457 可能性 * 効果 = 期待値
で考えると、この件は可能性が低いながら、
かなり悲惨な効果があるので積極的に回避すべきかと。
qsort速っ
そんなことより boost はまだかよ もうガマン汁出まくりですよ
Visual C++ Toolkit 2003でSTLPortをinstallする方法をご教授ください。 ググってもいまいちピンときません。
こっちの方が隔離スレという気がしないでもない。
>>458 他要素といっても同じstring型の情報じゃないでしょ。
ヒープ上に参照カウンタをもったアロケータが作成されており、
そのアロケータへのポインタだけを持っているというのがstringクラスの実態だろう。(gcc)
猫を積み上げる何個の方法だったかな…
>>465 ということは、stringのコピー時には文字列自体のコピーは発生しない(copy on write)
と思ってよい?
>>469 まあ少なくともgccとvcではそういう実装になっている。
安心してコピーしてよい。
VC++7.1付属のSTLはCOWしてないんじゃなかったか。 Effective STL 15項でいう実装D
してないね。…何だよこの汚いコーディングスタイルは…
VCとSTLportはしてなかったような気がしたけど。 昔のことだから今どうなってるかは分からないけどね。
wstringに3バイトの漢字が入ったらどうなるのですか? sizeof(wchar_t)って2ですよね?
wide character string multi byte string の違い理解していますか?
3バイト文字なんてあるの???
481 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 09:31:43 3バイト文字なんてあるの???
482 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 09:46:43 481 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 09:31:43 3バイト文字なんてあるの???
483 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 09:55:26 482 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 09:46:43 481 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 09:31:43 3バイト文字なんてあるの???
sizeof(wchar_t)==2のとき UCS-2 sizeof(wchar_t)==4のとき UCS-4 UTF-8とかは有り得ないから3バイトは無い
日本人ならUCS-4だろ。 チョソとかシナの漢字と統合なんて嫌だろ。
487 :
デフォルトの名無しさん :04/11/05 10:03:27
486 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 10:01:05 日本人ならUCS-4だろ。 チョソとかシナの漢字と統合なんて嫌だろ。
488 :
コピペ推奨 :04/11/05 10:05:23
489 :
デフォルトの名無しさん :04/11/05 10:05:27
487 名前:デフォルトの名無しさん :04/11/05 10:03:27 486 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 10:01:05 日本人ならUCS-4だろ。 チョソとかシナの漢字と統合なんて嫌だろ。
491 :
デフォルトの名無しさん :04/11/05 10:09:14
490=464
rubyは正しい感じ
sizeof(wchar_t)が何バイトかというのとエンコードには全く関連はない。 ちなみにWindowsでは一般的に2だが(APIの関係上)、Linuxなんかだと普通4
sizeof(wwchar_t) == 2な環境で、UCS-4にしたいなら、
sizeof(wwchar_t) == 4なchar_traitsの型作って、
basic_string<wwchar_t>すればいいけど、
>>479 はUTF-8の事を言っているとしか思えん…
Cでmbsはchar []であるように、C++でmbsはstringです。
wchar_t==2 wwchar_t==4 こう統一しようぜ
痛いスレだな
>>494 > sizeof(wwchar_t) == 2な環境で、UCS-4にしたいなら、
< sizeof(wchar_t) == 2な環境で、UCS-4にしたいなら、
VC6だけどmbsのstringって化けませんか? basic_string<char> でもbasic_string<unsigned char>でも sjisやjis入れてtokenizerすると化けるのですが 仕様? あきらめて wstringにしたけどね
そりゃあんた、stringはmbsに対応してないもん
>>894 で
> Cでmbsはchar []であるように、C++でmbsはstringです。
ってのがあったから すこし希望を見たんだけど やっぱ無理でつよね orz
あとCでmbsはchar[]とあるけど mbsは unsigned char[]ってのはVCの方言?
それ以前にsize()と文字数は全く別なものであるという突っ込みはないのか?
>>498 stringがmbsに対応していないのではなくて、tokenizerがmbsに対応していないだけ。
このスレ全体の印象として、初心者が回答者を演じているみたいなので
もうこのスレのログは削除して2度と来ないことにした、マジで。
有益な情報全然ないし。
まあ、std::stringがmbsに対応していないのは事実だが
char_traitsだけではMBSは扱いきれないんでしたっけ? ちょっと前どこかのスレで話題に上ってたように思うんだけれど.
基本的にmbsでoperator[]を実装するのは無理だから。
無理じゃないよ
>>505 >>504 はstd::base_string<class T>だと言いたいのでは?とエスパリング。
まあ、コンテナとして扱いたいってならmbcharクラスでも作らないとダメだわね。 がんばって作ったとしても、実行効率が悪そうな気もする。 コンテナとして扱わないなら、 問題になるのはfindとかだけなんだから、そこらへんをうまく、 MSのCRTみたいに、_MBCSが#defineされてるときはMBCS対応になるようにするとか、 そんな感じかな。
mbcsってのはbyte sequenceを、
multi byte character sequenceと「見做す」わけだから、
basic_stringで扱えないのは当たり前。
これは固定幅の文字のsequenceなんだから。
>>510 mbcharクラスってbasic_string<mbchar>するの?
それってwchar_tじゃない…
MSDNみてたら
文字のエスケープのところで
\xhhhh Unicode character in hexadecimal notation if this escape sequence is used in a wide-character constant or a Unicode string literal.
っての見つけたんですが、Microsoft Specific になっていないようなのですが、
VC++ では wchar_t はどうせ 2バイトだからこれでもいいとしても、
wchar_t がもっと大きい環境で U+00010000 以上の文字を扱いたいときはどうすればいいんでしょうか?
それと
>>485 って保証されてるんでしょうか?
いろんなエンコーディングを扱う汎用的なプログラムを書きたいんですが
485 が保証されてるとめちゃうれしいです・・・。
std::wstringになにが入ってるかなんか知るかヴォケ
>>512 それはwchar_tは使えないという事じゃない。
そもそも汎用にしたいのに、
>>485 が嬉しいってことが理解できない。
UCS-4やUTF-32扱えないと汎用にはならないから、
uint32_tを使うんが良いんじゃないの?
uint16_tでサロゲートペアを明示的に扱いますって言うんなら別だけど。
515 :
デフォルトの名無しさん :04/11/06 12:34:30
言語の質問でなくて申しわけないのですが、 kdevelopでSTLの入力補完をすることはできるのでしょうか?
>>514 L'\x0041' == L'A' == 0x0041;
これを期待してもいいのか?ってことです。
駄目です。当たり前です。
>>517 (512のMSDNの記述によると)
L'\x0041' == L'A'
までは保証されていると考えてよいのでしょうか?
マイクロソフトの世界では。(== 0x0041もね)
ワイド文字がUnicodeってのはVC++の実装であってC++の規格としてはなんの保証もない。
STL関係ないし、これでこの話題打ち切りね。
>>519-520 つまりMicrosoft Specificに指定し忘れただけということでしょうか。
Windows はUCS-2をサポートし, Linux は,UCS-2 の上位セットである UCS-4 をサポートしています。 C++Builderのヘルプより。 やっぱwchar_tが2バイトならUCS-2で wchar_tが4バイトならUCS-4でいいんじゃないの?
Rubyで全て解決。 C++なんて問題外^^;;;
>>524 ほとんどの処理系がそうなっているだけでC++の規格ではそうでなくても良い。
とはいっても代わりに使えるものなんてないと思うけどな。
Windowsは正確には『サロゲート・ペアを除いたUTF-16』だったような覚えが。
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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。