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

このエントリーをはてなブックマークに追加
139デフォルトの名無しさん
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;
}
140デフォルトの名無しさん:04/10/01 21:41:56
141デフォルトの名無しさん:04/10/01 22:13:59
>>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: 構文エラー : ';' が '{' の前に必要です。
143142:04/10/01 23:19:25
書き忘れましたがVC++6.0です。
144>>139:04/10/02 00:20:27
>>141
ひょえ〜〜〜〜〜〜
難しすぎ!!

wstringからstringに変換するだけでこんなにコード書かなきゃいけないのか・・・・
こんなのをイメージしてたのにぃ・・・・

string = "あしたははれだ";
wstring wstr = codecvt.wstringTOstring(str);

145デフォルトの名無しさん:04/10/02 00:34:35
>>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 ) を使って取得しないといけない。
146デフォルトの名無しさん:04/10/02 00:46:46
だからgccのサンプル見ろって。
MSDNのサンプルは質の低いのが多いから。
(多くをアルバイトが書いているらしい)

wstringstream使えな。
147デフォルトの名無しさん:04/10/02 00:51:36
MSのはサンプル以前にSTL自体の質が・・・。
148デフォルトの名無しさん:04/10/02 01:36:30
>>147
詳しく説明して下さい
149 ◆FIcNi4f8js :04/10/02 01:37:50
MSに質を求める方が間違ってる
150デフォルトの名無しさん:04/10/02 01:42:25
最新の奴はいけてるんでしょ。VC++って。

特にライブラリはプラウガがやってるしなあ。
100%適合の数少ない一つでしょ、ダンキンのライブラリ。
151デフォルトの名無しさん:04/10/02 02:10:20
VC++ 6.0まではいまいちだったけど
152デフォルトの名無しさん:04/10/02 02:42:38
今時VC++の質を叩いている奴は、
使えないロートルだな。
153デフォルトの名無しさん:04/10/02 03:35:25
>>144 素直にVCのマクロ使えば?
USES_CONVERSION;
MessageBoxA( W2A(L"今日はあめだ") );
154デフォルトの名無しさん:04/10/02 05:24:15
>>153
結論からいけばそうだろうけど
でも彼はcodecvを使ってやりたかったのでしょう。
155デフォルトの名無しさん:04/10/02 13:39:14
>>138
スレ違いで申し訳ないのですが、よかったらでいいのですが、
そういった記事(情報)はどうやって得るのか教えていただけないですか?
MSDNのホットトピックが配信されるようなMSのMLみたいなものがあるのですか?
156デフォルトの名無しさん:04/10/02 16:22:09
>>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;
}
157デフォルトの名無しさん:04/10/02 16:58:14
#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());
}
158デフォルトの名無しさん:04/10/02 18:43:37
mapで確保されるメモリ容量はどう計算したらいいでしょうか?
たとえば、
map<char,char>でN個のデータを確保した場合、2*N byteでいいですか?
どうも使用メモリ量が予想よりも多い気がします。
159デフォルトの名無しさん:04/10/02 18:54:11
>>158
そんなもん実装次第だがポインタ1個分は加わるだろ
160デフォルトの名無しさん:04/10/02 18:59:42
>>159
pointerだから1個につき4バイトですかね。漏れの場合は予想より3倍近くいってるのでびっくりしたわけです。
実装がまずいのかな。ちょっと見直してみます。
161デフォルトの名無しさん:04/10/02 19:52:08
>>160
お前の頭が一番まずいよ
162デフォルトの名無しさん:04/10/02 20:32:37
うん、まずいな。
163デフォルトの名無しさん:04/10/02 21:00:53
内部実装がRB-Treeだとすると,各ノード当たり
ポインタ3つ(左右の子と親)と色のenumが余計に付いていると
予想するのが妥当ですかね?ま,実装読めば良い話なんですが.
164デフォルトの名無しさん:04/10/02 21:15:40
>>163
RB-Treeの場合、色をポインタに埋め込んで持っていて
領域を特別確保していないことが多いとよく聞く。少なくとも
手元の実装ではそうなっていた。
165デフォルトの名無しさん:04/10/02 21:34:26
>>164
( ・∀・)つ〃∩ ヘェーヘェーヘェー.っていうか良くやる手ですよね.
VC++7.1ではポインタ3つ+char2つ余分に付いてました.
とりあえず最低限ポインタ3つ(iteratorの実装のために親へのポインタも不可避なはず)
は余分に使うってことですね.
166デフォルトの名無しさん:04/10/03 22:00:58
>>158
sizeof関数で取得できます。
例えばintなら、

int i;
sizeof(i);

167デフォルトの名無しさん:04/10/03 22:03:22
> sizeof関数
> sizeof関数
> sizeof関数
168デフォルトの名無しさん:04/10/03 22:06:26
sizeof int
169デフォルトの名無しさん:04/10/04 01:14:39
return関数みたいなもんじゃないの?
170デフォルトの名無しさん:04/10/04 01:18:12
> return関数
> return関数
> return関数
171デフォルトの名無しさん:04/10/04 01:28:04
似たような奴で、C++では新しく
typeid関数 throw関数
とかも増えたんだろうな。
172デフォルトの名無しさん:04/10/04 01:33:27
if関数はいいんだけど、for関数とかdo-while関数ってなんか文法的におかしいよね。
173デフォルトの名無しさん:04/10/04 01:38:56
>>171
int関数もだろ。
174デフォルトの名無しさん:04/10/04 02:09:34
ネタはマ板でやってくんないかなあ・・・
175デフォルトの名無しさん:04/10/04 15:55:56
>>156
stringはvectorと違って、メモリレイアウトは配列コンパチじゃないぞ
176デフォルトの名無しさん:04/10/04 16:04:39
>>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);
}
177デフォルトの名無しさん:04/10/04 17:34:47
#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());
}
178デフォルトの名無しさん:04/10/08 01:58:06
>>175
配列互換じゃないなら、basic_string::data()をどう説明するの?
具体的に、シリアルになってない実装のSTLとかあるの?

(・∀・)ニヤニヤ
179デフォルトの名無しさん:04/10/08 02:06:45
>178
より正確に表現するなら「配列互換であることが標準のどこにも保証されていない」.
実際,シリアルになっていない実装は少ないと思いますが,
それはあくまで多くの実装が「たまたま」シリアルな実装になっているだけでしょう.
ベンダの裁量次第では例えば配列互換でない実装をしておいて,data()が呼ばれたときに
シリアルに再配置してその先頭ポインタを返す,なんて実装をされていても
文句は言えないということです.
180デフォルトの名無しさん:04/10/08 02:12:47
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.
181デフォルトの名無しさん:04/10/08 02:13:23
シリアル配置したコピーバッファをc_str(), data()関数で提供しつつ、
内部で断片化されたデータを使い続けるような2度手間な実装だったら、ある意味凄い。
・・・つか、イラネ。
182デフォルトの名無しさん:04/10/08 02:18:03
stringは、resize()でヌルセットされる実装である点なども考慮して
MFCのCStringみたいに生バッファアクセスを許可して欲しいところだ。
最大の問題はreserve()がVCとgccで挙動が違うところだと思う。
183デフォルトの名無しさん:04/10/08 02:51:18
>>178
「規格に関係なく書いたコードでも動けばよい」というような
態度は周りが迷惑する。
184デフォルトの名無しさん:04/10/08 03:09:01
>>183
迷惑ってんなら、「規格」も周りに迷惑をかけまくってるだろ。

とりあえず、論より証拠で不具合が発生するSTLベンダ名をうpしてくれ。あるんだろ?
話はそれから。
185184:04/10/08 03:12:44
複数のインスタンスから参照されるアドレスを上書きと問題が起こるのは既知だけどな。
参照カウンタを自力でリセットしてから>>156のようにやるのは、なかば常識だろ。
186デフォルトの名無しさん:04/10/08 05:50:24
>>185
君の常識はみんなの非常識
187デフォルトの名無しさん:04/10/08 07:39:04
>>184
可哀想なくらい頭悪!
188デフォルトの名無しさん:04/10/08 07:40:05
>>184
君の論法は「国の法律は俺にとっては都合が悪いからどんどん変えてくれ」
と言っているのと全く同じだね。

(・∀・)ニヤニヤ
189デフォルトの名無しさん:04/10/08 08:24:19
>>188
君はまず国語を理解した方がいいね。
190デフォルトの名無しさん:04/10/08 11:36:46
>>189
おやおや姦国人ですか?日本語が読めないとは。
191デフォルトの名無しさん:04/10/08 13:15:21
どうでもいいからさ、不具合のあるSTL挙げてくれよ(プゲラ
実際に体験したからご立派なこと言ってんだよね?>>178
ちゃんと報告して下さいね(プゲラ
192デフォルトの名無しさん:04/10/08 13:33:41
(プゲラ
(プゲラ
(プゲラ
193デフォルトの名無しさん:04/10/08 13:35:24
>>191
>>180 嫁。
194デフォルトの名無しさん:04/10/08 13:37:14
vector以外はシリアルな実装になっていると保障されていないので
vector以外を C API に直接渡したり、直にバッファをいじったりするコードは
移植性が下がる
195デフォルトの名無しさん:04/10/08 13:41:11
>>191==アフォ
196デフォルトの名無しさん:04/10/08 21:31:37
哀れすぎる
197デフォルトの名無しさん:04/10/08 23:17:18
ISO規格ではvectorも保証されてないだろ。
現在時期C++に向けての修正案で保証するべきという用件があがっているだけで。
198デフォルトの名無しさん:04/10/08 23:26:48
1つのサイズがわずか1or2バイトであるstringの連続性が保証されず、
サイズが可変であるvectorの連続性が保証されるというのも不思議な話だ。
199デフォルトの名無しさん:04/10/08 23:59:39
はぁ?
200デフォルトの名無しさん:04/10/09 00:24:05
何不明
201デフォルトの名無しさん:04/10/09 00:24:45
1つのサイズがわずか1or2バイト
1つのサイズがわずか1or2バイト
1つのサイズがわずか1or2バイト
202デフォルトの名無しさん:04/10/09 00:51:00
>>198
T array[N]; の連続性も不思議だと思うのかな。
203デフォルトの名無しさん:04/10/09 01:17:38
>197
いえ,保証されています.
ISO/IEC IS 14882:1998にvectorの連続性の保証を追加するという提案は
すでにTC(Technical Corrigenda:正誤表)として正式に受理されています.
要するにvectorの連続性の保証の記述が無かったのは単に誤植だという扱いです.
新しい版の規格書ではすでに修正されています.

http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#69
204197:04/10/09 01:22:37
>>203

オタク臭い文章・・・。やはりC++ユーザーってちょっとアレだな
205203:04/10/09 01:26:52
>204
自分でもそう思いますw
206デフォルトの名無しさん:04/10/09 01:27:49
Ruby >>>>>>>>>>>>>>>>>>>>>>> C++=臭いオタク寄るな
207デフォルトの名無しさん:04/10/09 01:30:20
なぜ素直に「そうだったんですか。知りませんでした」
と言えないんだ>>204のオタクは
騙り臭いし
208デフォルトの名無しさん:04/10/09 01:30:54
>>205
204はテンプレだよ
209デフォルトの名無しさん:04/10/09 17:57:07
listやvectorに対するrbegin/rendって標準でしたっけ。
210デフォルトの名無しさん:04/10/09 18:13:15
>>209
標準
211デフォルトの名無しさん:04/10/09 19:06:59
・・・ですね。

rbeginでとったiterator経由でeraseしようとしても失敗しちゃうのは仕様
ッスかね?

list<int> mylist;
mylist.push_back(1);
mylist.push_back(2);
mylist.push_back(3);
itr = mylist.rbegin();
mylist.erase(itr); // コンパイルエラー

212デフォルトの名無しさん:04/10/09 19:11:35
仕様
213デフォルトの名無しさん:04/10/09 19:13:07
>>211
rbegin()で返ってくるのはreverse_iteratorであってiteratorじゃない。
214デフォルトの名無しさん:04/10/09 19:16:15
>>211
後ろ消したいんだったら空でないこと確かめて
list <int>::iterator itr (-- mylist.rbegin().base ());

list <int>::iterator itr (-- mylist.end ());
215デフォルトの名無しさん:04/10/09 19:59:46

pop_back
(本題と外れてるけど)
216デフォルトの名無しさん:04/10/09 21:54:14
嘘を教えてる人がいるYO。
217デフォルトの名無しさん:04/10/09 22:36:17
嘘教えちゃいけないっていう法律でもあるの?
218デフォルトの名無しさん:04/10/09 22:42:28
偽証罪に問われるよ
219デフォルトの名無しさん:04/10/09 23:29:36
へえw
220デフォルトの名無しさん:04/10/09 23:54:50
なんでiteratorとreverse_iteratorって同一の抽象クラスを持ってないのかな
221デフォルトの名無しさん:04/10/09 23:58:01
Effective STL
222デフォルトの名無しさん:04/10/10 01:41:04
を見ろ。
223デフォルトの名無しさん:04/10/10 02:16:44
っていうのは冗談。
224デフォルトの名無しさん:04/10/10 03:24:15
なんちゃって。
225デフォルトの名無しさん:04/10/10 03:33:39
ごめん
226デフォルトの名無しさん:04/10/10 16:52:48
>>218
恥ずかしい奴だなあ。偽証罪って裁判所内でしか関係ないぞ。
227デフォルトの名無しさん:04/10/10 16:55:11
ネタニマジレスハズカシイ
228デフォルトの名無しさん:04/10/10 18:36:31
ネタがつまらなすぎる
229デフォルトの名無しさん:04/10/10 19:35:50
>>228
必死すぎ
230デフォルトの名無しさん:04/10/15 00:08:45
>>226
国会に証人喚問された人も。
231デフォルトの名無しさん:04/10/15 02:25:50
>>230
全くの板違いだが気になったので。

国会の証人喚問は法廷並みの扱いなので
ここでの嘘は偽証罪に問われる。

疑惑の政治家が証人喚問に呼ばれるのは
「記者会見で言ったことがここでも言える?
嘘だったら警察に捕まるよ〜ん」ってこと。
232デフォルトの名無しさん:04/10/15 04:38:03
>>231
その話がSTLとどういう関係があるのか?
233デフォルトの名無しさん:04/10/15 06:03:02
>>231
キーワードわかってんだからググれば?
234デフォルトの名無しさん:04/10/17 18:52:34
1引数ファンクタを0引数ファンクタに落とすクラスは標準にないでしょうか?
2引数を1引数にするにはbind1stとかを使えばいいのですが。
別に自作してもたいした手間ではないのですがなんか・・・
235デフォルトの名無しさん:04/10/17 22:52:38
>>234
ない。
236デフォルトの名無しさん:04/10/17 22:56:01
自作してもたいした手間ではないものほど標準であって欲しい
237235:04/10/17 23:01:40
>>234
ごめん。
クラスね。unary_functionがある。でも、生成関数はない。
238デフォルトの名無しさん:04/10/18 01:06:57
非標準ならboost::bind,boost::lambda::bindとかが使えるかな.
あ,でもここSTLスレだった・・・.
239デフォルトの名無しさん:04/10/18 22:56:12
unary_functionとbiary_functionの型パラメータは
なんで最後が戻り値の型なんでしょう

最初にあった方が直感的だと思うけど・・・
240デフォルトの名無しさん:04/10/19 05:58:42
仕様決めた人間に聞け
241デフォルトの名無しさん:04/10/19 14:24:49
>>239
俺もそう思た
確かLokiでは最初に戻値型があったような
242デフォルトの名無しさん:04/10/19 17:14:28
センスがなかったんだな。きっと。
243今度はな、名前が…:04/10/19 23:50:04
そこでキーワード引数ですよ。
244デフォルトの名無しさん:04/10/25 21:51:48
そこで、じゃないだろ
もともと順序性あるのにわざわざキーワードにマップする意味なし
245デフォルトの名無しさん:04/10/26 16:22:30
順序性あるか?
たまたまC++の構文がそうなっているだけのような気がするが。
246デフォルトの名無しさん:04/10/26 22:30:59
見た目の順序のことを言っているだけだが?
247デフォルトの名無しさん:04/10/26 23:02:06
だけだが?
248デフォルトの名無しさん:04/10/26 23:07:44
けだが?
249デフォルトの名無しさん:04/10/26 23:08:55
だが?
250デフォルトの名無しさん:04/10/26 23:10:39
ガッ!
251デフォルトの名無しさん:04/10/26 23:15:25
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
253デフォルトの名無しさん:04/10/27 00:30:55
int total = std::accumulate(vecint.begin(), vecint.end(), 0);
254デフォルトの名無しさん:04/10/27 00:35:30
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さんので以降と思います。

ありがとうございました
256デフォルトの名無しさん:04/10/27 00:45:49
一冊でもまともな本を持ってたら
そのまんまの記述が見つかるレベルだぞこれ。
ちゃんと本買ったほうがいいんじゃねえか?
257デフォルトの名無しさん:04/10/27 01:20:03
>>255
boostでは無名関数が定義されていますので、こういうこともできますよ
int sum = 0;
std::for_each(data.begin(), data.end(), (sum += boost::lambda::_1) );
258デフォルトの名無しさん:04/10/27 01:23:12
>>257 スレ違い。
259デフォルトの名無しさん:04/10/27 01:31:44
>>258
確かにスレ違いだけど、STLを使っている人の中にはBOOSTを使う用意の
ある人も多いのではないかと思っている。
そういった人が、STLではこうしているがもっとスマートにはならないだろうか、
と考えた時、BOOSTの中にある選択肢を"たまたま"知らなかったとしたらBOOSTスレ
にそれを聞きに行くだろうか。
知らないものは、聞きにはいかない。
ここでキーワードを教えるくらいは良いと思うけれどね。
260デフォルトの名無しさん:04/10/27 01:32:59
てかC++スレ分割しすぎ
261デフォルトの名無しさん:04/10/27 01:38:41
>>260
C++は分割して作業しやすいように出来ているからね。
262デフォルトの名無しさん:04/10/27 01:44:16
>>257
無名関数ですか、perlっぽいすがまた、激しくカコイイですね
未だにCライクにループで回す癖が抜けませんw
263デフォルトの名無しさん:04/10/27 01:51:24
>>262
もともとはLispのlambda式なんだけどね。
BOOSTのlambdaはちょっと違和感があるけれど。。。
264デフォルトの名無しさん:04/10/27 04:22:44
>>259
すれ違いで悪いんですが、Delphiでの解決方法教えてください
265デフォルトの名無しさん:04/10/27 04:32:40
>>264
257はありだろうけど
さすがにそれはDelphiスレで聞くべきだよ
(本当に知りたければね)
266デフォルトの名無しさん:04/10/27 07:44:02
>>259
アホは放置しろ。
267デフォルトの名無しさん:04/10/27 08:25:04
そういえば結局、次期標準でBoostから採用されるものって何なんだ?
268デフォルトの名無しさん:04/10/27 08:46:47
269デフォルトの名無しさん:04/10/27 08:51:57
日本語読めないの
270268:04/10/27 10:04:06
>>269
スマン寝てないの
271デフォルトの名無しさん:04/10/27 10:26:43
>>267
function, tuple, type_traits, regex, mem_fn, shared_ptr, ref, bind
272デフォルトの名無しさん:04/10/27 11:09:28
とりあえずofficial wishlist置いときますね
http://lafstern.org/matt/wishlist.html
273デフォルトの名無しさん:04/10/29 07:58:03
STLportにバグが見つかったそうな。
274デフォルトの名無しさん:04/10/29 07:59:55
>>273
('A`) マジデ?
275デフォルトの名無しさん:04/10/29 08:45:05
いっぱいあるだろそんなもん。
276デフォルトの名無しさん:04/10/29 18:10:45
STLPortなんてどうして使うの?
277デフォルトの名無しさん:04/10/29 18:24:13
>>276
付属stlがくそだからじゃないか?
278デフォルトの名無しさん:04/10/29 18:28:57
STLSoftもつかおーぜ
279デフォルトの名無しさん:04/10/29 19:48:50
>>278
そんな怪しい名前のソフトは使いたくねーなw
280デフォルトの名無しさん:04/10/29 21:28:40
281デフォルトの名無しさん:04/10/30 02:30:33
std::map<std::string,int> Map;

Map.insert(std::pair<std::string,int>(std::string(""),1));
            ~~~~~~~~~~~~~~~
の部分をハードコーディングではなく書けませんか?
282デフォルトの名無しさん:04/10/30 02:33:42
typedef std::map<std::string,int> OrenoMap;
typedef std::pair<std::string,int> OrenoPair;

OrenoMap Map;

Map.insert(OrenoPair(std::string(""),1));
283デフォルトの名無しさん:04/10/30 02:34:19
>>281
typedef std::pair<std::string,int> hoge;
284デフォルトの名無しさん:04/10/30 02:34:35
う゛ぁぅえ_tyぺ
285デフォルトの名無しさん:04/10/30 02:39:03
>>281
std::pair<>(std::string(""), 1)
ってこと?
286デフォルトの名無しさん:04/10/30 02:42:00
>>285
それOKなんですか?
287デフォルトの名無しさん:04/10/30 02:44:27
Map[""] = 1;
288デフォルトの名無しさん:04/10/30 02:49:46
>>286
ダメだからmake_pairってのが用意されてたりする
289デフォルトの名無しさん:04/10/30 03:44:07
>>281
Map.insert(std::make_pair(std::string(""), 1));

古いコンパイラだと受け付けないのもあるかもしれませんが・・・.
290デフォルトの名無しさん:04/10/30 06:01:19
typedef std::map<std::string,int> MapT;

MapT m;
m.insert(MapT::value_type(std::string(""),1));
291デフォルトの名無しさん:04/10/30 06:03:53
m.insert(MapT::value_type("",1));
でもOK
292デフォルトの名無しさん:04/10/30 09:35:27
そんな面倒なことせんでも>>287でOKだろ。
293デフォルトの名無しさん:04/10/30 10:06:19
こうr
294デフォルトの名無しさん:04/10/30 10:23:17
>>292
意味が違うし
295デフォルトの名無しさん:04/10/30 12:39:40
>>294
詳しく
296デフォルトの名無しさん:04/10/30 15:35:17
map::insertはkeyが既存の場合,値が変更されません.
287さんのはkeyが既存のものも変更されます.
あと,細かいところだと293さんが書かれているの(効率)もあります.
297rubykitch:04/10/30 19:16:52
全部EffectiveSTLの受け売りですねぷぷううううううううううううううううううううううううううううう
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>C++
298デフォルトの名無しさん:04/10/30 19:40:16
SuperRubyistはEffectiveSTLまで読んだのか
299デフォルトの名無しさん:04/10/30 20:49:05
SuperRubyisは勉強熱心だね。
300デフォルトの名無しさん:04/10/30 23:26:32
vector <string> temp;

ってやっちゃっていいのでしょうか?
なんかVC6だと警告でるのですが・・・。
301デフォルトの名無しさん:04/10/30 23:29:03
>>300
警告の内容も晒さずに人様の貴重な時間を浪費して良くそんなことが聞けるな。
302Ruby!!!!!!!!!!!!!!!:04/10/30 23:32:19
vc6は窓から投げ捨てろ
303デフォルトの名無しさん:04/10/30 23:33:47
>>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
>>303
レスありがとうございました。
306デフォルトの名無しさん:04/10/31 23:29:04
今更だけど、std::mapより素直に力技のstd::vectorの検索を実装しといた方が柔軟な仕様変更に強いね。
メモリ消費量も断片化しないからstd::vetorは捨てたものじゃない。
当初の予想以上に作り込む必要が出てきたときstd::mapは厳しいね、いろんな意味で。
307デフォルトの名無しさん:04/10/31 23:40:19
おいおい…
お前の設計段階での抽象化が甘いだけだよ。
308デフォルトの名無しさん:04/10/31 23:41:30
>>306
力技の実装が素直なわけないだろ。
「仕様変更に強い」ではなくて、
たまたま実装に都合のいい仕様変更がはいっただけじゃないのか?

特殊なケースを一般的であるかのように言うのは感心できない。
309デフォルトの名無しさん:04/10/31 23:50:16
そもそもvectorを代わりに使うならmapじゃなくてmultisetになりそうなもんだが
310デフォルトの名無しさん:04/10/31 23:55:22
>>309 どっちでもいけるだろ。
311デフォルトの名無しさん:04/11/01 00:01:49
map<T1, T2>をvector<pair<T1, T2> >にしたのかもしれん
312デフォルトの名無しさん:04/11/01 00:05:15
>>311
その通りですが、なにか?
313306:04/11/01 00:07:34
コンテナ要素が複雑であった場合は結局、諸々の検索方法を実装しなければならず、
std::mapのキー検索の存在感が、かすむ、かすむ。
みんなはどうしてるわけ?mapにおけるキー以外の検索。
314デフォルトの名無しさん:04/11/01 00:13:15
>>313
boost::multi_index

ってのはもうちょっと先の話だが、
キー以外の検索があるのなら map に不満が出るのはあたりまえ。
最初っからそう言えよ。
315デフォルトの名無しさん:04/11/01 00:14:09
普通に考えて、set<自分で作ったクラス>、だろ。
他に選択肢がありえる理由がわからん。
316デフォルトの名無しさん:04/11/01 00:17:50
>>315
less でソートされてる必要は無いから set で保持するのは無駄だろ。
317デフォルトの名無しさん:04/11/01 00:19:00
std::vectorで済むものはそうしているし、
駄目なものは他のものを使っている。例えば赤黒木。
いずれにせよ、検索のための"algorithm"をstd::vector専用に書いたりはしない。
318デフォルトの名無しさん:04/11/01 00:19:51
>>316
いつも無駄なわけじゃないだろ?
319306:04/11/01 00:21:29
>>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++を勉強してこい、話はそれからだな
321デフォルトの名無しさん:04/11/01 00:28:03
>>319
ひょっとして、検索が主な用途じゃないのか?
322デフォルトの名無しさん:04/11/01 00:29:00
>>319
なんで初めにmapを使ったのか、理由を教えて。
323デフォルトの名無しさん:04/11/01 00:40:24
>>319
メモリ消費量の大きさが「無駄」になるかどうかは使う場面ごとに違うだろ。
reserve するためには要素数に対する前提が必要だろ。

繰り返すが、
特殊なケースを一般的であるかのように言うのは感心できない。
324306:04/11/01 00:41:49
>>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してみたけど意味無かった。
326デフォルトの名無しさん:04/11/01 00:44:34
[cppll:5647] ソート済みベクタは遅い?
これ見てからはもっぱらソース済みvectorは使わなくなったな。
327デフォルトの名無しさん:04/11/01 00:47:43
>>324
おもいっきり>>307-308じゃんかw
328デフォルトの名無しさん:04/11/01 00:48:39
>>323
自分の経験則からいくと、vector::reserveの冗長性を織り込んだメモリ消費量より、
std::listやstd::set,std::mapのメモリ断片化によるメモリ消費量の肥大化の方が厄介でした。
多くの場合、要素数のおおよその数が分かっているので、したがってvectorが最適である可能性が高い。
しかも、そのサイズに関する最適化の効果を確実に得られるのもvectorの特徴。
他のコンテナではPGによる最適化の手段が限られている。
329デフォルトの名無しさん:04/11/01 00:49:53
>要素数のおおよその数
予想も付かない場合が多い。
330デフォルトの名無しさん:04/11/01 00:51:33
vectorはPGが要素数を教えて上げないと極端に遅くなるか
極端にメモリが無駄になるかのどちらかになるから。

vector以外のコンテナはそんな事は無い。
331デフォルトの名無しさん:04/11/01 00:53:12
つかそこまでいったらUNIX DBとかsqliteぐらい使えよ。
332デフォルトの名無しさん:04/11/01 00:54:29
>>328
要素数が多くて、さらに、その数が予め解かってる場合は、
vectorがいいですね、そうですね、そうですよ。
333デフォルトの名無しさん:04/11/01 00:54:44
>>329
さっきからstd::setを賞賛する痛い人と同一人物ですか?
同一人物でしたら残念ですが同意できません。
別人でしたら同意します。やっぱこういうのは、ケースバイケースですから。
334デフォルトの名無しさん:04/11/01 00:57:19
>>326
ソース済みvector(・∀・)イイ!
335デフォルトの名無しさん:04/11/01 00:57:47
>>333
ハゲワラタ
336デフォルトの名無しさん:04/11/01 00:58:51
>>333
setを薦めてるレスは>>315だけじゃない?
それも要素数の話が出る前の検索用コンテナの話題で。
337デフォルトの名無しさん:04/11/01 01:00:04
俺も306なら不同意だけど、他なら同意だ。
ケースバイケースだからな。
338306:04/11/01 01:02:19
ぶっちゃけ、>>324で述べた仕様が、
Unixにおけるlocate・slocateコマンドをメモリ常駐バージョン化して毛が生えた
他愛のないものであることは十分承知してます。でも作ってしまったものはしょうがない。orz
339デフォルトの名無しさん:04/11/01 01:02:39
検索するインデックスキーがある程度決まってる場合は
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
がいいよ。
340デフォルトの名無しさん:04/11/01 01:11:35
やっぱ言葉足らずな人が出ると盛り上がるな。
341デフォルトの名無しさん:04/11/01 01:12:23
>>328
vector は reserve が使える。それだけ憶えとけば十分。
そんな経験則、実際の判断に勘定するべきではない。

> メモリ断片化によるメモリ消費量の肥大化
ほんとで「断片化」が原因だったのか、怪しい言い回しだな。
342デフォルトの名無しさん:04/11/01 02:32:22
邪道だが、std::vectorをqsort()でソートすると効率が大幅に改善するから使ってる。
qsort(&v[0], v.size(), sizeof(v::reference_type), comp_func);


というか、なぜvector::sort()はあんなに遅いのだろうか・・・。
vector::stable_sort()は現在順序を反映してくれるので許せるが。
343デフォルトの名無しさん:04/11/01 02:47:16
STLにvector::sort()なんて存在しません
344342:04/11/01 02:57:50
>>343
失礼。訂正。

vector::sort() → std::sort()
vector::stable_sort() → std::stable_sort()
345デフォルトの名無しさん:04/11/01 03:11:37
Celeron 1GHz, mem 256MB, VC++7.1で実験
int 1000000個を持ったvectorのソート

最適化なし qsort 1.9s sort 6.2s
最適化あり qsort 1.1s sort 0.8s

最適化してなかったとかいうオチだったらヌッコロス
346デフォルトの名無しさん:04/11/01 03:15:39
>>345
ちゃんと文字列を入れたstringで試してみ
347デフォルトの名無しさん:04/11/01 03:20:06
>>345
intでやってみた。
ソースは
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=250
環境AthlonXP3000+、PC2700 1GB、XPSP1

vector algorithm sort = 5198079
vector qsort = 8201075
vector stable sort = 9188932

vectorの中身によって大幅に変わる。
348デフォルトの名無しさん:04/11/01 03:27:54
おまいら部分ソートってのしらないの?
349デフォルトの名無しさん:04/11/01 03:28:27
なんで部分ソートが出てくるの?
350デフォルトの名無しさん:04/11/01 03:29:47
partial_sort()を使ってどうする。この場合。
351デフォルトの名無しさん:04/11/01 03:32:58
某スレで出た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;
}
352デフォルトの名無しさん:04/11/01 03:41:45
>>351
VC++7.1 -O2 -GX
qsort
201ms
std::sort(Compare())
511ms
std::sort
481ms
353デフォルトの名無しさん:04/11/01 03:43:05
>>351
for(int i=0;i<16;i++)
はjにしなきゃ。
354デフォルトの名無しさん:04/11/01 03:44:36
>>351
std::sort()の方はコンストラクタ・デストラクタ・コピーコンストラクタ・代入演算子
が頻繁に使われてしまうから、これではまともな比較ができん。
355デフォルトの名無しさん:04/11/01 03:45:56
jに直した物
VC++7.1 -O2 -GX
qsort
4256ms
std::sort(Compare())
5116ms
std::sort
6960ms
356デフォルトの名無しさん:04/11/01 03:46:26
>>354
どう直したらまともな比較になるの?
357デフォルトの名無しさん:04/11/01 03:47:42
std::sortって
コンストラクタ・デストラクタ・コピーコンストラクタ・代入演算子を
定義し直さないといけないのか。
使うの面倒だな
358デフォルトの名無しさん:04/11/01 04:14:09
std::stringにはswap()メンバ関数があるから、それを活用して特殊化した
sort()が必要そうだな。どちらにしろqsort()は動かない処理系はまずない
だろうが、危険な香りがプンプンする。
359デフォルトの名無しさん:04/11/01 04:24:25
いや,stringに対して自由関数のswapが特殊化されているのは
標準で明記されていますよ.だから,sortはこのswapを使うはず.
なので,上のようなoverheadの由来がよく分かりません.
どこに原因があるのか知りたいです.(sortの実装詳細?)
360デフォルトの名無しさん:04/11/01 04:34:59
>>359
標準のstd::sort()はstd::stringに対してswapを使うと明記されてるの?
初耳だが。STLport4.6.2を調べてみたが、特殊化されている気配はない。
std::stringの場合はsort()を自作した方がいいんじゃないの?そんなに
速度の低下が気になるなら。
361デフォルトの名無しさん:04/11/01 04:42:31
組込型をソートするならstd::sort
クラス・構造体をソートする時はqsort
と使い分けるのが良さそうだな。
362デフォルトの名無しさん:04/11/01 04:43:40
Effective STLは嘘つきだな
363デフォルトの名無しさん:04/11/01 04:52:39
>>362
何項が怪しいと思うんだ?ちなみに聞いてみるが。
364デフォルトの名無しさん:04/11/01 04:58:17
読み直してみたら可能性が高いとかいう書き方で逃げてやがった
365デフォルトの名無しさん:04/11/01 05:19:44
>>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);) を使ってくれないんですか?
367デフォルトの名無しさん:04/11/01 05:42:07
>>366
残念ながらテンプレート・パラメータとしてswap関数を与えるバージョンは
標準にはない。君が作ってくれ。
368デフォルトの名無しさん:04/11/01 06:40:56
>>366
CodeWarrior付属のSTLはちゃんと使う。std::stringを扱う場合も
インライン展開されるstd::sortの方がqsortよりずっと速い。
std::sortが遅いのはVC++処理系固有の問題、御愁傷様
369デフォルトの名無しさん:04/11/01 06:44:11
>351
qsortは一回の比較につきless, eq, greaterの情報を取得できるのに、
std::sortだとlessとgeqの情報しか取得できないじゃん。
にも関わらずstrcmp()使ってるから比較にかかる時間は同じ。
こんなファンクタ書かれたら明らかにstd::sortが遅くなるに決まってる。
370デフォルトの名無しさん:04/11/01 07:09:27
>>369
( ゚Д゚)ハァ?
371デフォルトの名無しさん:04/11/01 07:25:54
>>369
stable sortなら算術比較が有効な場合もあるけどなあ。
372デフォルトの名無しさん:04/11/01 07:42:59
string に qsort って、未定義だろ。
string::swap() は規格に載ってる。
sort が swap 使っていいかどうかは不明。
373デフォルトの名無しさん:04/11/01 08:08:19
stringをmemcpy(3)しちゃうわけだもんね。
374デフォルトの名無しさん:04/11/01 08:42:27
>>372
stringにqsortして動かなくなる実装があったら教えて
375デフォルトの名無しさん:04/11/01 08:45:28
>>368
gcc3.3.4
gcc3.4.2
bcc5.6.4
で試したら全部qsortの方が速かったよ。
376デフォルトの名無しさん:04/11/01 08:46:33
結論…CodeWarriorは最強
377デフォルトの名無しさん:04/11/01 08:57:29
g++(mingw) 3.3.3 -O2
qsort
4336ms
std::sort(Compare())
7000ms
std::sort
7631ms
378デフォルトの名無しさん:04/11/01 08:59:13
bcc32 5.6.4 -O2
(元スレから拾ってきた)
qsort:1963ms
std::sort(Compare()):2673ms
std::sort:3395ms
379デフォルトの名無しさん:04/11/01 09:05:48
CodeWarriorには全米が泣いた
380デフォルトの名無しさん:04/11/01 09:17:22
mingw - g++ 3.4.2 -O2 @ AMD Duron1.2GHz

qsort 50ms
std::sort(Compare()) 1713ms
std::sort 2053ms

qsort速いね..
381デフォルトの名無しさん:04/11/01 09:24:26
私のおじいさんが教えてくれた、初めてのC++言語実装。
それはCodeWarriorで、私は4歳でした。
その味は甘くてクリーミーで、こんな素晴らしい実装を教えてもらえる私は、
きっと特別な存在なのだと感じました。
今では、私がおじいさん。
孫に教えてあげるのは、もちろんCodeWarrior。
なぜなら、彼もまた特別な存在だからです。
382デフォルトの名無しさん:04/11/01 09:41:48
>>378
BCCのqsortそんなに遅かったか?

BCC5.6.4 -O2 -vi
AthlonXP3000+ 1GB XPSP1
qsort:78ms
std::sort(Compare()):1218ms
std::sort:1437ms
383デフォルトの名無しさん:04/11/01 09:55:46
これは交換を行う演算子があったほうがよかったかもしれんね。
swap関数では言語的に統制されたインターフェースとしては弱い。

int a, b;
a @= b; // aとbを交換するトカ
384デフォルトの名無しさん:04/11/01 10:12:57
a <=> bの方が直感的
385デフォルトの名無しさん:04/11/01 10:59:35
ヌッコロされるべきは>>345だったというオチか。
セレロンユーザの分際で粋がるとああなるっていう典型だな(藁
386デフォルトの名無しさん:04/11/01 11:10:12
>>345 晒しあげw
セレロン使いのおこちゃまが夜更かししちゃ駄目だぞ。
387デフォルトの名無しさん:04/11/01 11:11:35
漏れは鱈セレ使いと河童セレ使いは違いの分かる香具師だと信じている。
藁セレ使いはアフォ北森以降セレ使いは貧乏
388380:04/11/01 11:28:40
当方 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) では何かまずいんでしょうか…?ただのバグ?
389デフォルトの名無しさん:04/11/01 11:32:41
結果がおかしくなるわけじゃないんだからバグではないだろう
390デフォルトの名無しさん:04/11/01 11:37:05
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);
}

となっている
391デフォルトの名無しさん:04/11/01 11:39:07
>>390
VC++7.1のDinkumwareもそうなってる
392デフォルトの名無しさん:04/11/01 11:44:03
GNU側のミスっぽいな
393デフォルトの名無しさん:04/11/01 11:45:31
それでも結局qsortの方が全然速いのでした。

                         −完−
394デフォルトの名無しさん:04/11/01 11:46:44
STLスレに来てるんだから遅くったってstd::sort使えよ。
ビヤーンが泣くぞ
395デフォルトの名無しさん:04/11/01 11:48:06
qsortのqは速いって意味だ。
ただのsortより速いに決まっているであろう
396デフォルトの名無しさん:04/11/01 11:49:49
qsortより速いCodeWarriorはネ申だな。どうなってるのやら。
397デフォルトの名無しさん:04/11/01 11:57:00
2010年にはC++の実装はCodeWarriorしか残ってないかもな
398デフォルトの名無しさん:04/11/01 11:59:05
これはもうCodeWarriorの単独スレ立てるしか無いな
399デフォルトの名無しさん:04/11/01 14:12:22
CodeWarriorのヘッダソースだけもらってきて(以下ry
400デフォルトの名無しさん:04/11/01 14:41:34
同じソースコードから各開発環境で生成した実行ファイルを同一OS・同一PC上で比較しなければだめでしょ。
CodeWarriorの最適化が甘いという落とし穴がないとは限らない。
どうするよ?CodeWarriorのqsortがVC7.1のstd::sortに負けてたら。

そんなわけで、CodeWarriorとVC7.1両方使えるユーザは同じコードを使ってVC7.1バージョンと比較してみて。
401デフォルトの名無しさん:04/11/01 14:59:39
>>388
CVSでは修正されたみたいだ。
詳細は http://gcc.gnu.org/ml/libstdc++/2004-08/msg00167.html
402デフォルトの名無しさん:04/11/01 15:03:11
仕様の話しよう
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;
}
404デフォルトの名無しさん:04/11/01 15:33:18
>>403
クイックソートに不向きな順序付けの実装ですね。
ただ、今争点になっているのはコンテナのswap()のコストに関してなので、少し違うかも。
405デフォルトの名無しさん:04/11/01 15:58:06
このスレには司会者がいたのですね。
なかなか格調高いスレですね。
406デフォルトの名無しさん:04/11/01 16:14:44
>>400
両方使えるが、どのソースを使ったらいいんだい?
407デフォルトの名無しさん:04/11/01 16:15:41
てか>>361みたいな感じで使い分ければいくない?
408デフォルトの名無しさん:04/11/01 16:47:32
>>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
409デフォルトの名無しさん:04/11/01 17:10:50
やっぱCodeWarriorのqsortが遅いだけというオチだったな。
410デフォルトの名無しさん:04/11/01 17:15:48
CodeWarriorのstd::sort(Compare())なかなか早いね。
MS clもstlportを使えばもっと早くなるんじゃないかな。
411デフォルトの名無しさん:04/11/01 17:55:23
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.
412デフォルトの名無しさん:04/11/01 20:54:49
今日、久しぶりに部屋の掃除をしたらウジの死骸を
見つけた。どうりで最近子バエがよく飛んでると思った。
その話を踏まえて
例え時間が最短でも楽をすると痛い目に会うということだね。
413デフォルトの名無しさん:04/11/01 21:21:55
>>412
スレ違い氏ね
414デフォルトの名無しさん:04/11/01 22:53:29
>>413
「氏(うじ)ね」?
415デフォルトの名無しさん:04/11/01 22:56:21
あーはいはいうまいうまい

↓次の方どーぞー
416デフォルトの名無しさん:04/11/01 22:56:33
ふいんき同然のバカ出現。
417デフォルトの名無しさん:04/11/01 23:03:41
しゅみれーしょん
418デフォルトの名無しさん:04/11/02 09:14:49
ちょいと質問です

vectorなどのコンテナを利用し、
サイズの大きい構造体(Hoge)を動的にデータを格納する場合
vector<Hoge> よりも vector<Hoge*> の方がオーバーヘッドが少ないと聞きました

で、実際その方法でやってみたわけなんですが、
この方法だと結局自分でメモリ確保して解放する手間が出てきて
コンテナ利用する利点が失われるのでは、と思ったわけで…

本当にオーバーヘッドが大きいのでしょうか?
それとこの方法で、コンテナを利用するのはごく普通なことなんでしょうか?

auto_ptr 使えとかは無しでお願いします
419デフォルトの名無しさん:04/11/02 09:16:36
てか自分でベンチ取ればいいじゃん。
420デフォルトの名無しさん:04/11/02 09:28:07
>>418
vector<Hoge> → vector<Hoge*>

+ 要素の追加時に起こる O(n) のコピーが軽い
これは明らかな利点。
「オーバーヘッド」とか言ってる奴はたぶんこれを指してる。

- 寿命管理の必要がある
shared_ptr 使えば回避できる。
ただし、その場合は一つ目の利点を再検証してみたほうがいいだろう。

- アクセス速度はほとんど変わらないだろうが、厳密には遅くなっている
よっぽどシビアな環境でなければ無視してかまわないはず。

? 要素それぞれでメモリ確保するので使用メモリが増える可能性がある(減る可能性もある)
もともと Hoge のサイズが大きいなら、これも無視できるかも。
421デフォルトの名無しさん:04/11/02 09:31:00
ポインタだと間接参照になるから
vectorの恩恵(メモリ上で連続しているためアクセス速度が速い)が受けられない。
422デフォルトの名無しさん:04/11/02 09:33:48
>>418
> vectorなどのコンテナを利用し、
> サイズの大きい構造体(Hoge)を動的にデータを格納する場合
> vector<Hoge> よりも vector<Hoge*> の方がオーバーヘッドが少ないと聞きました

言っている意味を説明しろ。>オバーヘッド
423デフォルトの名無しさん:04/11/02 09:35:49
vector<T*>だとポインタサイズ×要素数メモリ消費が増えるね。
424デフォルトの名無しさん:04/11/02 09:37:39

>+ 要素の追加時に起こる O(n) のコピーが軽い
>これは明らかな利点。
>「オーバーヘッド」とか言ってる奴はたぶんこれを指してる。

何この人RVOも知らないの?
425デフォルトの名無しさん:04/11/02 09:39:03
実データとポインタ配列を両方とも併用するという発想はでてこないのだろうか?
いつから二者択一するという前提になったのだろう?
426デフォルトの名無しさん:04/11/02 09:44:17
>>424
capacity超えて再確保し直す時の話じゃないの?
427デフォルトの名無しさん:04/11/02 09:45:25
>>425
空気嫁
428デフォルトの名無しさん:04/11/02 09:45:47
RVOが関係するのか。
俺のC++理解度もまだまだだなぁ(pgr
429デフォルトの名無しさん:04/11/02 09:45:53
>>424
どこに Return Value Optimization の出番が?
430デフォルトの名無しさん:04/11/02 09:48:20
>>429
424はまったく話が理解できてないだけだよ。
431デフォルトの名無しさん:04/11/02 09:53:52
つまり Hoge* でコンテナを作れば、
コンテナ数の増減やコンテナのコピーは早いが、
実データにアクセスするにはロスが生じる

という解釈でよろしいでしょうか?
結局、Hoge で行った方がいいみたいですね

いろいろ返答ありがとうございました
432425:04/11/02 10:17:05
>>427
お前こそ空気読め。
433デフォルトの名無しさん:04/11/02 10:18:52
よほどクリティカルでなければHogeでいいんじゃない
クリチカルなら面倒なことに手を入れなきゃなんないだろうけど
434デフォルトの名無しさん:04/11/02 10:20:55
>>431
>実データにアクセスするにはロスが生じる

・・・文章ちゃんと読めてる?
435デフォルトの名無しさん:04/11/02 10:23:56
>>434
>>420 >- アクセス速度はほとんど変わらないだろうが、厳密には遅くなっている
>>421
からそう解釈しましたが、違いますか?
436デフォルトの名無しさん:04/11/02 10:24:27
結局>>425はスルーされてる訳だが w
437デフォルトの名無しさん:04/11/02 10:31:22
>>435
もう一行下は読んだのか?
438デフォルトの名無しさん:04/11/02 10:38:10
ま、知ったかぶりの>>421が諸悪の根源なわけだが。
>>421は悪意をもった初心者だ。気をつけろ。
439デフォルトの名無しさん:04/11/02 10:41:04
>>421がC/C++歴半年以下なら回答者を偽装したアフォとして許すが、
半年以上でかつシラフなのであればPGをやめるべきだろう。
だれか肩たたいてやれ。
440デフォルトの名無しさん:04/11/02 10:47:57
でかいvectorをiteratorで叩くなら、
>>421の言っていることも嘘ではないぜ?
441デフォルトの名無しさん:04/11/02 10:55:03
>>440
「iteratorで叩く」とはどういう意味?
初めて聞いた。英語だとどう表現するの?
442デフォルトの名無しさん:04/11/02 12:05:50
演算子つくるのめんどいのでノータイムでnoncopyable&shared_ptr
443デフォルトの名無しさん:04/11/02 14:23:57
パフォーマンスの話は一般論が出たとこで終わり。
きちんと計測してから出直して来い。
444デフォルトの名無しさん:04/11/02 18:56:25
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()によって
特殊化したテンプレート関数を起こすように設計されているとかなりの効率
の向上が期待できそうだ。以上。
445デフォルトの名無しさん:04/11/02 18:58:04
追記。stringには比較演算子がオーバーロードされているが、このように
c_str()を使ってstrcmp()による比較を用いた方がVC7.1の場合は速くなった。
446デフォルトの名無しさん:04/11/02 18:59:55
失礼。
>>444
×コピーコンストラクタなどの副作用
○代入演算子のオーバーヘッド
447デフォルトの名無しさん:04/11/02 19:18:39
>>444
stringは中身の長さが異なってもクラス自体の大きさは一緒の処理系が
多いぞ。しかしそれに依存したプログラムを書くと移植性が無くなってしまう
けどな。
448デフォルトの名無しさん:04/11/02 19:20:51
しかし標準C++ではsizeof(std::string)は取得可能のはずだから、固定長と
言う事でいいんじゃないの?
449デフォルトの名無しさん:04/11/02 19:40:18
std::sortのswap相当部分をmemcpyにしたのが一番速い?
450デフォルトの名無しさん:04/11/02 20:01:36
>>447
そもそも中身の大きさに応じて自身のサイズを変えるなんて出来るのか?
型がちがくなっちまわないか?
451デフォルトの名無しさん:04/11/02 20:08:05
>>450
そりゃそうだよな。
452デフォルトの名無しさん:04/11/02 23:36:47
>>447
確かに。
gccのstd::stringはsizeof(std::string)が4バイト。
453デフォルトの名無しさん:04/11/02 23:39:41
アフォばっかだな
454デフォルトの名無しさん:04/11/02 23:47:35
データの入れ替えでmemcpyを使って問題が発生する可能性って無いよね?
と思ったけど、thisをメンバに持ってるとか、そんなことやってる場合も多々あるな。
455デフォルトの名無しさん:04/11/02 23:49:58
>>453
自分では何も書かないくせにアフォ言う権利ないよ。
456デフォルトの名無しさん:04/11/02 23:52:00
型のサイズが変動する事なんて有り得ないって言うC++の基本が分かってないんだもの
457デフォルトの名無しさん:04/11/02 23:54:57
>>454
そういう代物を複数用意して配列にセットする状況があるかどうかだが、・・・実際あるのかね?
リンクリストを車輪再発明したアフォクラスならありうるとは思うのだけど。
458デフォルトの名無しさん:04/11/02 23:58:40
stringでも参照カウンタと他要素のthis持ったりするよね。
459デフォルトの名無しさん:04/11/03 00:07:41
>>457
可能性 * 効果 = 期待値
で考えると、この件は可能性が低いながら、
かなり悲惨な効果があるので積極的に回避すべきかと。
460デフォルトの名無しさん:04/11/03 00:09:44
qsort速っ
461デフォルトの名無しさん:04/11/03 00:15:16
そんなことより boost はまだかよ
もうガマン汁出まくりですよ
462デフォルトの名無しさん:04/11/03 00:49:07
Visual C++ Toolkit 2003でSTLPortをinstallする方法をご教授ください。
ググってもいまいちピンときません。
463デフォルトの名無しさん:04/11/03 00:57:31
>>461
隔離スレから出てくるなよ
http://pc5.2ch.net/test/read.cgi/tech/1091198276/
464デフォルトの名無しさん:04/11/03 07:58:03
こっちの方が隔離スレという気がしないでもない。
465デフォルトの名無しさん:04/11/04 10:06:00
>>458
他要素といっても同じstring型の情報じゃないでしょ。
ヒープ上に参照カウンタをもったアロケータが作成されており、
そのアロケータへのポインタだけを持っているというのがstringクラスの実態だろう。(gcc)
466デフォルトの名無しさん:04/11/04 10:08:05
>>465
そんなの実装による。
467デフォルトの名無しさん:04/11/04 14:23:33
猫を積み上げる何個の方法だったかな…
468デフォルトの名無しさん:04/11/04 18:42:42
>>467
16
469デフォルトの名無しさん:04/11/04 20:03:34
>>465
ということは、stringのコピー時には文字列自体のコピーは発生しない(copy on write)
と思ってよい?
470デフォルトの名無しさん:04/11/04 21:31:58
>>469
だからそれも実装依存だっつーのに
471デフォルトの名無しさん:04/11/04 22:00:00
>>470
ソースは?
472デフォルトの名無しさん:04/11/04 22:00:36
>>471
>>467-468が載ってる本
473デフォルトの名無しさん:04/11/04 22:08:27
>>472
持ってないな。
買っとこ。
474デフォルトの名無しさん:04/11/05 00:27:59
>>469
まあ少なくともgccとvcではそういう実装になっている。
安心してコピーしてよい。
475デフォルトの名無しさん:04/11/05 01:22:15
VC++7.1付属のSTLはCOWしてないんじゃなかったか。
Effective STL 15項でいう実装D
476デフォルトの名無しさん:04/11/05 03:34:24
してないね。…何だよこの汚いコーディングスタイルは…
477デフォルトの名無しさん:04/11/05 03:38:27
>>476 ( ゚д゚)ポカーン
478デフォルトの名無しさん:04/11/05 06:53:18
VCとSTLportはしてなかったような気がしたけど。
昔のことだから今どうなってるかは分からないけどね。
479デフォルトの名無しさん:04/11/05 08:24:47
wstringに3バイトの漢字が入ったらどうなるのですか?
sizeof(wchar_t)って2ですよね?
480デフォルトの名無しさん:04/11/05 09:27:47
wide character string
multi byte string
の違い理解していますか?
481デフォルトの名無しさん:04/11/05 09:31:43
3バイト文字なんてあるの???
482デフォルトの名無しさん:04/11/05 09:46:43
481 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 09:31:43
3バイト文字なんてあるの???
483デフォルトの名無しさん:04/11/05 09:55:26
482 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 09:46:43
481 名前:デフォルトの名無しさん[sage] 投稿日:04/11/05 09:31:43
3バイト文字なんてあるの???
484デフォルトの名無しさん:04/11/05 09:56:48
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バイト文字なんてあるの???
485デフォルトの名無しさん:04/11/05 09:59:06
sizeof(wchar_t)==2のとき
UCS-2
sizeof(wchar_t)==4のとき
UCS-4

UTF-8とかは有り得ないから3バイトは無い
486デフォルトの名無しさん:04/11/05 10:01:05
日本人なら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だろ。
チョソとかシナの漢字と統合なんて嫌だろ。
490デフォルトの名無しさん:04/11/05 10:07:10
>>464は正しい感じ
491デフォルトの名無しさん:04/11/05 10:09:14
490=464
492デフォルトの名無しさん:04/11/05 10:10:34
rubyは正しい感じ
493デフォルトの名無しさん:04/11/05 10:11:01
sizeof(wchar_t)が何バイトかというのとエンコードには全く関連はない。
ちなみにWindowsでは一般的に2だが(APIの関係上)、Linuxなんかだと普通4
494デフォルトの名無しさん:04/11/05 10:12:14
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です。
495デフォルトの名無しさん:04/11/05 10:14:24
wchar_t==2
wwchar_t==4
こう統一しようぜ
496デフォルトの名無しさん:04/11/05 10:20:34
痛いスレだな
497デフォルトの名無しさん:04/11/05 10:20:35
>>494
> sizeof(wwchar_t) == 2な環境で、UCS-4にしたいなら、
< sizeof(wchar_t) == 2な環境で、UCS-4にしたいなら、
498デフォルトの名無しさん:04/11/05 12:26:20
VC6だけどmbsのstringって化けませんか?
basic_string<char> でもbasic_string<unsigned char>でも
sjisやjis入れてtokenizerすると化けるのですが 仕様?
あきらめて wstringにしたけどね
499デフォルトの名無しさん:04/11/05 12:32:07
そりゃあんた、stringはmbsに対応してないもん
500498:04/11/05 12:37:10
>>894
> Cでmbsはchar []であるように、C++でmbsはstringです。
ってのがあったから すこし希望を見たんだけど やっぱ無理でつよね orz
あとCでmbsはchar[]とあるけど mbsは unsigned char[]ってのはVCの方言?
501デフォルトの名無しさん:04/11/05 12:37:41
それ以前にsize()と文字数は全く別なものであるという突っ込みはないのか?
502デフォルトの名無しさん:04/11/05 12:43:52
>>498
stringがmbsに対応していないのではなくて、tokenizerがmbsに対応していないだけ。

このスレ全体の印象として、初心者が回答者を演じているみたいなので
もうこのスレのログは削除して2度と来ないことにした、マジで。
有益な情報全然ないし。
503デフォルトの名無しさん:04/11/05 12:44:10
>>501
そんな的外れな突っ込みはないよ。
504デフォルトの名無しさん:04/11/05 12:46:45
まあ、std::stringがmbsに対応していないのは事実だが
505デフォルトの名無しさん:04/11/05 14:49:11
char_traitsだけではMBSは扱いきれないんでしたっけ?
ちょっと前どこかのスレで話題に上ってたように思うんだけれど.
506デフォルトの名無しさん:04/11/05 14:55:10
基本的にmbsでoperator[]を実装するのは無理だから。
507デフォルトの名無しさん:04/11/05 15:15:00
無理じゃないよ
508デフォルトの名無しさん:04/11/05 17:11:45
>>506
定数時間ですまないから?
>>507
詳しく
509デフォルトの名無しさん:04/11/05 23:20:48
>>505
>>504はstd::base_string<class T>だと言いたいのでは?とエスパリング。
510デフォルトの名無しさん:04/11/05 23:44:56
まあ、コンテナとして扱いたいってならmbcharクラスでも作らないとダメだわね。
がんばって作ったとしても、実行効率が悪そうな気もする。

コンテナとして扱わないなら、
問題になるのはfindとかだけなんだから、そこらへんをうまく、
MSのCRTみたいに、_MBCSが#defineされてるときはMBCS対応になるようにするとか、
そんな感じかな。
511デフォルトの名無しさん:04/11/06 01:57:34
mbcsってのはbyte sequenceを、
multi byte character sequenceと「見做す」わけだから、
basic_stringで扱えないのは当たり前。
これは固定幅の文字のsequenceなんだから。

>>510
mbcharクラスってbasic_string<mbchar>するの?
それってwchar_tじゃない…
512デフォルトの名無しさん:04/11/06 03:35:54
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 が保証されてるとめちゃうれしいです・・・。
513デフォルトの名無しさん:04/11/06 09:51:38
std::wstringになにが入ってるかなんか知るかヴォケ
514デフォルトの名無しさん:04/11/06 10:50:25
>>512
それはwchar_tは使えないという事じゃない。

そもそも汎用にしたいのに、>>485が嬉しいってことが理解できない。
UCS-4やUTF-32扱えないと汎用にはならないから、
uint32_tを使うんが良いんじゃないの?
uint16_tでサロゲートペアを明示的に扱いますって言うんなら別だけど。
515デフォルトの名無しさん:04/11/06 12:34:30
言語の質問でなくて申しわけないのですが、
kdevelopでSTLの入力補完をすることはできるのでしょうか?
516デフォルトの名無しさん:04/11/06 13:25:39
>>514
L'\x0041' == L'A' == 0x0041;
これを期待してもいいのか?ってことです。
517デフォルトの名無しさん:04/11/06 13:42:42
駄目です。当たり前です。
518デフォルトの名無しさん:04/11/06 13:48:47
>>517
(512のMSDNの記述によると)
L'\x0041' == L'A'
までは保証されていると考えてよいのでしょうか?
519デフォルトの名無しさん:04/11/06 14:00:25
マイクロソフトの世界では。(== 0x0041もね)
520デフォルトの名無しさん:04/11/06 14:00:36
ワイド文字がUnicodeってのはVC++の実装であってC++の規格としてはなんの保証もない。
521デフォルトの名無しさん:04/11/06 14:09:00
STL関係ないし、これでこの話題打ち切りね。
522デフォルトの名無しさん:04/11/06 14:09:19
>>519-520
つまりMicrosoft Specificに指定し忘れただけということでしょうか。
523デフォルトの名無しさん:04/11/06 14:11:14
>>521
basic_stringはSTLだぞ
524デフォルトの名無しさん:04/11/06 16:54:17
Windows はUCS-2をサポートし,
Linux は,UCS-2 の上位セットである UCS-4 をサポートしています。

C++Builderのヘルプより。
やっぱwchar_tが2バイトならUCS-2で
wchar_tが4バイトならUCS-4でいいんじゃないの?
525デフォルトの名無しさん:04/11/06 16:55:42
Rubyで全て解決。
C++なんて問題外^^;;;
526デフォルトの名無しさん:04/11/06 17:22:08
>>524
ほとんどの処理系がそうなっているだけでC++の規格ではそうでなくても良い。
とはいっても代わりに使えるものなんてないと思うけどな。
527デフォルトの名無しさん:04/11/06 19:08:28
Windowsは正確には『サロゲート・ペアを除いたUTF-16』だったような覚えが。
528デフォルトの名無しさん:04/11/09 19:40:09
wstringを使おうとしたところ、undeclaredのエラーが出ました。
#include <string>とusing namespace stdは書いてあります。
Cygwinとg++を使っています。
何がいけないのでしょう。
529デフォルトの名無しさん:04/11/09 20:01:54
>528
・エラーメッセージを勝手に省略しない
・ソースコードの原因となっていそうな部分は最低限提示する
530528:04/11/09 20:06:16
とりあえずソースはこれだけです。
#include <string>
using namespace std;
int main()
{
  wstring s;
  return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

(*line)[0] = '*'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

list1 3 2 1 0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  return sum / sumCount;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

とか

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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