[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 06/21 15:50 / Filesize : 177 KB / Number-of Response : 685
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.59【環境依存OK】



1 名前:デフォルトの名無しさん [2008/09/06(土) 22:45:12 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.58【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1218023777/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

205 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 22:15:20 ]
初期のセレロンの1コア2GHzですよ

206 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 22:19:00 ]
NetBurst系は他のCPUとはかなり異質な結果が出るらしいからなあ

207 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 23:31:29 ]
すみません、初心者な私に教えて下さい。

#include <list>

using namespace std;

class C
{
public:
 int ic;

 C (int c) { ic = c; }
};

int main()
{
 list<C *> mylist;

 mylist.push_back( new C(0) );
 mylist.push_back( new C(1) );
 mylist.push_back( new C(2) );
}

こんな感じになってるとして、ic == 1 であるようなオブジェクトだけを、
・list から削除し、
・かつ delete する
には、どのように書けばよいのでしょう。


208 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:32:06 ]
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

class C {
public:
int ic;

C (int c) { ic = c; }
~C() { cout << "~C" << endl; }
};

struct delete_equal_to: public std::binary_function<C *, int, bool> {
bool operator ()(C * p, int c) const {
return (NULL != auto_ptr<C>(p->ic == c ? p: NULL).get());
}
};

int main() {
list<C *> mylist;

mylist.push_back( new C(0) );
mylist.push_back( new C(1) );
mylist.push_back( new C(2) );

cout << mylist.size() << endl;
mylist.remove_if(bind2nd(delete_equal_to(), 1));
cout << mylist.size() << endl;
}

209 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:41:07 ]
>>208
returnの中はp->ic == cだとだめなの?って書こうとしたが、deleteさせる意図があるのね。
そこまでするくらいなら、list<shared_ptr<C> >使えよって言ってやるべきだと思う。

210 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:45:31 ]
「まだ」C++標準ではないのでね。

211 名前:207 mailto:sage [2008/09/14(日) 00:57:04 ]
ぐっは、難しい…。
もしかしてさらっと書ける構文とかあるのかと思ったら、そうでも無いのですね。
でも一つずつ読解してみます。
ありがとうございました!

212 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:59:34 ]
ついでに言っておくけど
mylist.push_back( new C(0) );
はpush_backに失敗するとnew C(0)したオブジェクトがリークする

213 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:15:33 ]
馬鹿な私に教えて下さい。
宿題板で、作って頂いたc++なのですが習ってない部分も出ていて、
よくわからず、困っています。
習っていない関数を使うのには、特に問題はないのですが
提出の際に説明書っぽいのをつけるのですが作成できず困っています。
例えば、この作業をするには?とか、オプションでこんな事も出来ます
とかです。

スレチかもしれませんが、宜しくお願いします。
ちなみに、宿題板ではボロボロに言われ、ここにきました。
すいません。

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7720.txt



214 名前:207 mailto:sage [2008/09/14(日) 01:18:29 ]
なるほど…。

ということは、push_back() の引数として直接与えるんじゃなくて、
いったん

C *p = new C(0);

して、とりあえず mylist.push_back( p ); としてみて、
std::bad_alloc が投げられたらあきらめて delete する、
みたいな感じでしょうか。

215 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:22:08 ]
>>213
そんなの一から読めって言うのかよ。
大まかな機能ぐらい説明しろよ。
お前が作らせたんなら分かるだろうが。
というか、宿題スレ池。

C/C++の宿題を片付けます 115代目
pc11.2ch.net/test/read.cgi/tech/1217741118/

216 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:29:56 ]
>>215
わかりました。宿題スレに行きます。
すいませんでした。ご迷惑お掛けしました。

ちなみに、内容はエンコドとデコドで
テキストを吐き出し、オプションでプリントするみたいな感じです。

失礼しました。

217 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:33:41 ]
見たけどコメントついてるじゃん
無理せずに単位落としたら?

218 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:36:08 ]
>>214
bad_allocが投げられたらdeleteする必要はないぞ。

219 名前:207 mailto:sage [2008/09/14(日) 01:42:05 ]
>>218
了解しました。
どうもありがとうございます。

220 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 02:24:00 ]
>>218
お前は読み間違えてる

221 名前:207 mailto:sage [2008/09/14(日) 02:29:02 ]
>>220
あ、やっぱ delete(p); は必要ですか。
ていうか私が言葉足らずでした。

222 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 03:02:24 ]
std::bad_alloc例外が投げられるという事はメモリ確保に
失敗しているのだから、deleteしたらまずいだろう

223 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 03:37:51 ]
こういうことだろ。bad_allocを投げるのはmylist、pはdeleteしないといけない。
C *p = new C(0);
try
{
  mylist.push_back(p);
}
catch (std::bad_alloc const&)
{
  delete p;
  throw;
}
auto_ptrでもいける。
std::auto_ptr<C> p(new C(0));
mylist.push_back(p.get());
p.release();



224 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 03:54:17 ]
>>223
ああそういう意味かごめん
そりゃdeleteは必要だわ

newとpush_backを分離する事を前提とした
話なのね

225 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 06:23:11 ]
>>207
さらっと、というか自分でループまわす構文はあるよ。
STL的ではないけど。

for(list<C *>::iterator it=mylist.begin(); it != mylist.end();) {
// 1なら
if((*it)->ic == 1) {
delete *it;
it= mylist.erase(it);
}
// 1じゃないなら
else {
++it;
}
}

226 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 06:53:47 ]
確かboostだとこう書ける

#include <boost/ptr_container/ptr_list.hpp>

typedef boost::ptr_vector<C> list_type; //ポインタ指定しないが、中身はポインタになる
list_type mylist;
mylist.push_back( new C(0) );


for(list_type::iterator it = mylist.begin(); it != mylist.end();) {
 if(it->ic == 1) {
  it = mylist.erase(it);  //消去動作で自動でdeleteされる
 }
〜 //あとは225と一緒

詳細
ttp://www.kmonos.net/alang/boost/classes/pointer_container.html

227 名前:207 mailto:sage [2008/09/14(日) 10:05:26 ]
>>223
> こういうことだろ。bad_allocを投げるのはmylist、pはdeleteしないといけない。

あ、そうです。言葉足らずというのはそれが言いたかったのでした。

>>225
おおお、これです。こんな感じのを期待していました!

> STL的ではないけど。

というのは、イテレーションしていく過程はあくまでイテレータにまかせるべきで、
「it= mylist.erase(it);」のような「つなぎかえ」(?)のようなことを外野がやるのは
スマートじゃない、ということでしょうか。

うーむ、「実行時に動的に new したものを連結させておき、いらなくなったらそこだけ外す」
というのは良くあるケースかと思っていたのですが、もしかしてそもそもデータ構造の
選び方が間違ってますか……? >>224氏も、

> newとpush_backを分離する事を前提とした
> 話なのね

とおっしゃってるし……。

>>226
いろいろな環境で動かしたいのでできれば boost は避けたいのですが、
でも勉強になります。特にリンク先の「etc」のところ。

ありがとうございます。

228 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 16:03:52 ]
>>227
boostって静的リンク(?)だから大丈夫じゃないの?

229 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 16:44:57 ]
ファイル分割+テンプレートの特殊化で悩んでいます。

Test.h(Testクラス ヘッダファイル)
Test.cpp(Testクラス コンストラクタ)
show.cpp(Test<T>::show() 関数)
show1.cpp(Test<Test<int>>::show() show()のテンプレート特殊化)
で構成されています。

show.cppにあるTest<T>::show()を
アップしたファイルのように書き換えるとコンパイルエラーが発生してしまい、
これを解決できません。
よろしくお願いします。

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7722.txt

230 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 17:58:13 ]
Test.hのtemplate <typename T>class Testのメンバ関数として
friend ostream &operator << (ostream &str, T const &val) {
return str << val ;
}
C++はあまり使ったことはないけど、これでも追加するといいかも
エロいひとの解答待つか

231 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:12:39 ]
>>225
list だと、こうじゃなかったっけ?
ごめん。調べないで書いてる。

for (list<C *>::iterator it = mylist.begin(); it != mylist.end();) {
  if ((*it)->ic == 1) {
    delete *it;
    mylist.erase(it++);
  } else {
    ++it;
  }
}

232 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:37:02 ]
erase したイテレータを++するのは未定義動作じゃなかったか?

233 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:45:29 ]
>>232
mylist.erase(it++);
はイテレータを進めてから、進める前のイテラータに対してeraseするから問題ないと思うよ。
listのeraseでは消したイテレータ以外は無効にならないから。



234 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 21:04:13 ]
戻り値が次の要素じゃなかったっけ?
it = mylist.erase(it);

235 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 21:41:25 ]
listなら++でも安全だとしても、別なコンテナに変えられる可能性も
考慮して、戻りを代入するべきでは。

236 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 22:10:33 ]
>>235
set,multissetとかだとeraseの戻り値の型がvoidだったりするから、
it == hoge.eraseが書けないときもある。

vectorならeraseの戻り値を使えても、別なコンテナに変えられる可能性も
考慮してit++にするべきでは。

237 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 22:53:20 ]
>>236
vectorならit++は使えない。

238 名前:229 [2008/09/14(日) 22:53:23 ]
>>230
ありがとうございます。

<<のオーバーロードで修正がベスト何ですかね。


239 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 23:26:15 ]
vectorの場合remove_ifして得た新しい末尾以降をそれぞれdeleteした後にerase(new_end, end)
とlistとはやりかたが違うから、差し替え考慮するのは無理があるんでない?


240 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 02:15:17 ]
vectorとdequeはeraseの後反復子が無効化されるので、eraseの戻り値が必要。
mapやsetはeraseの戻り値がvoidなので、it++するしかない。
シーケンスコンテナと連想コンテナの取り替えを想定するのは
無理があるって事だな。

241 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 09:14:33 ]
effective STL に同じような話がある

242 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:28:05 ]
Visual C++ 2008 Express Editionでコンパイルした実行ファイルを、VC++が入ってないPCではエラーが出て実行できないんですけど
VC++が入ってないPCでも実行する方法を教えてください。

243 名前:207 mailto:sage [2008/09/15(月) 10:29:22 ]
>>225 氏の方法でも >>231 氏の方法でもうまくいきました。
ありがとうございます。

「別なコンテナに変える」ということの意味はまだ良くわからないので、
引き続き勉強します。

>>241
> effective STL に同じような話がある

なるほど、早速ポチりました。



244 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:47:02 ]
>>242
エラーが出ないように修正する

245 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:53:17 ]
>>244
VC++がインストールされているPCではエラーがなく実行できます。

246 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:54:07 ]
>>242
まずはエラーの内容を示さないと・・・・
MFC7のdllがないとかか。

247 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:59:51 ]
SideBySide絡みじゃ?
MSから再配布可能なんちゃらを実行するPCにインストールすればいいとおも

248 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:49:58 ]
>>246
ほかのパソコンで実行すると指定したプログラムは実行できません。と表示されます。

249 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:52:21 ]
何で初心者って「エラーが出ます」「うまくいきません」
「動きません」って言って具体的なこと書かないんだろうな。

250 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:53:18 ]
>>248
本当にメッセージそれだけ?

251 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:57:28 ]
>>250
今はほかのパソコンにもVC++を入れてしまっているので確認はできないんですけど、もう少し長かったような気がします。
VC++を入れてない人のパソコンでも何かインストールをしなくても普通のアプリケーションみたいに実行できるようにしたいんです。

252 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:01:39 ]
>>251
1. VC++のバージョンにあうランタイムライブラリをインストールさせる。
www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&DisplayLang=ja
www.microsoft.com/downloads/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&DisplayLang=ja

2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。

253 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:22:30 ]
>>251
基本的によく分からないエラーが出たら、
スクリーンショットを撮る事。

そのプログラムのプロジェクトプロパティの
共通言語ランタイムサポートが「使用しない」以外なら
.NET Framework Runtime をインストールする必要がある。

MFCの使用が「共有DLLで〜」なら「スタティックライブラリで〜」に。

構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。



254 名前:242 mailto:sage [2008/09/15(月) 12:26:45 ]
調べたらDebugフォルダの中の実行ファイルをただほかのPCに移動するだけでは、駄目らしいということがわかりました。
ソリューション構成をReleaseにしてコンパイルしたものを、ほかのPCに移動して実行すればいいんでしょうか。
今はそばにVC++が入ってないPCがないので確認ができないんですけど、それでいいのでしょうか。

>>253
今はエラーを確認できないのでスクリーンショットも撮れません。

255 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:30:06 ]
pow DOMAIN errorのメッセージダイアログを出ないようにするにはどうすればいいですか

256 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:31:07 ]
>>254
>それでいいのでしょうか。
お前、>>252-253を読んだ上で言ってるの?

257 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:51:00 ]
STLSOFTが良さそう 日本語の解説すくない だれか教えて。 Windowsに限ればboostよりいい気がしてる。

www.stlsoft.org
STLSoftの中身

ACESTL (acestl.org).
ATLSTL (atlstl.org).
COMSTL (comstl.org).
.netSTL (dotnetstl.org).
InetSTL (inetstl.org).
MFCSTL (mfcstl.org).
UNIXSTL (unixstl.org)
WinSTL (winstl.org).
もうなんだか至れり尽せりですね。

自分がやっているプロジェクトの意味が無いように思えてきた・・・。おrz!!!
d.hatena.ne.jp/studiokingyo/20061223

258 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:51:32 ]
>>255
どういうソースで出るんだ?

259 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:53:36 ]
>>252
できればほかのパソコンに何かインストールする方法は避けたいです。
>2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。
よくわかりませんでした。もう少し詳しく教えてください。

>>253
共通言語ランタイムサポートを使用しないになっています。
>MFCの使用が「共有DLLで〜」なら「スタティックライブラリで〜」に。

>構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。
この設定でコンパイルすると
1>MSVCRT.lib(wcrtexew.obj) : error LNK2019: 未解決の外部シンボル _wWinMain@16 が関数 ___tmainCRTStartup で参照されました。
1>C:\Documents and Settings\****\My Documents\Visual Studio 2008\Projects\Othello\Debug\Othello.exe : fatal error LNK1120: 外部参照 1 が未解決です。
と、なってコンパイルできません。

>>256
調べてる間にレスがきてしまったので失礼しました。

260 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:55:16 ]
>>257
自分で翻訳なり、ソース解析なり出来ないなら諦めた方が良い
問題が起きたとき、自力で解決出来んだろう

261 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:02:02 ]
>>259
main() で始まるコンソールプログラムなのに コンソールプロジェクトになっていないんじゃ・・・

WinMain() で始まる windows プログラムなのに、
そのエラーとなると tchar.h あたりの UNICODE 関連が怪しい

262 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:02:51 ]
>>259
「/MDd」を「/MT」にしてないか?
「/MDd」なら「/MTd」だぞ。MD→MTなんだから。

あとプロジェクトプロパティの左上に構成ってあるだろ。
デバッグ版とリリース版で設定が分かれてるから、それぞれ設定を変えること。
まぁ、リリース版だけでも良いと思うけど。

263 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:06:10 ]
>>261 忘れて。 オプション変えたらリンク通らなくなっただけじゃ違うわ



264 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:03:24 ]
2chでスレたてて盛り上げていこうぜ > STLport
日本語の解説サイトも作る

265 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:04:29 ]
STLport > STLsoft ね。

266 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:29:55 ]
>>258
こんな感じだそうです。
pow()は底 の乗数 乗の計算を行って返す関数である。底 がゼロで乗数 がゼロ以下の場合にはdomain errorが発生する。また、底 が負で乗数 が小数の場合にもdomain errorになる。計算結果がオーバーフローする場合はrange errorが発生する。

267 名前:266 mailto:sage [2008/09/15(月) 14:30:56 ]
追記:その状態になってもダイアログを出したくないのです

268 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:54:55 ]
double d;
d = pow(0.0, -2.1);
std::cout << d << std::endl;

d = pow(-2.1, 0.1);
std::cout << d << std::endl;

d = pow(10e10, 100);
std::cout << d << std::endl;

---------------
1.#INF
-1.#IND
1.#INF

再現出来ないな。何が違うんだろう。

269 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 15:01:17 ]
ウィンドウプロジェクトにするとなります。

270 名前:デフォルトの名無しさん [2008/09/15(月) 16:19:19 ]
stlの質問です。
下記のプログラムを実行するとhoge関数が呼ばれて戻ってきた時には、TESTメンバのstrの領域はデストラクタで、
解放されてしまってます。この場合は、main()の最後でlistのstrを解放するしかないのでしょうか?
もっと別のやり方があれば教えて下さい。宜しくお願いします。

#include <string>
#include <list>

struct TEST {
std::string *str;
TEST() : str(NULL) {}
~TEST() { delete[] str; }
};

void hoge(std::list<TEST> &list)
{
TEST test;
test.str = new std::string[10];
list.push_back(test);
}

int main()
{
std::list<TEST> list;
hoge(list);
// list.str不適切なポインタ
return 0;
}

271 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:02:15 ]
C++で数値計算を行なっていて、
計算結果を1ステップごとにfstream使ってファイルhoge.txtに出力していました。
上記とは一切関係ない部分のバグを取って再度実行したら、
ファイルへの出力が途中からされなくなってしまいました。
1000回計算するとしたら380回から出力されません。ただ、coutではきちんと値が表示されます。
出力されなくなった後もプ゚ログラム自体は動き続けているためエラーが出ず、原因がわかりません。
このような症状の場合、どのような原因が考えられるか教えていただけませんか?

272 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:12:59 ]
・ストレージの空き容量が不足している。

273 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:20:56 ]
・ストリームをフラッシュしていない(勿論、クローズしていない)。



274 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:23:12 ]
そんなわけ・・・・マジだ、吊ってきます orz
エラーを出す方法とかありますか?

275 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:23:27 ]
380回のあたりで異常な文字列を吐いてしまって
fstreamがエラー状態になっているとか。

276 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:24:33 ]
>>270
TESTにきちんとコピーコンストラクタとoperator =を設ける。

277 名前:271 mailto:sage [2008/09/15(月) 17:25:52 ]
>>274>>272に対してのレスです。
申し訳ない

278 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:34:40 ]
of.exceptions(badbit| failbit)としておけば、例外投げてくれる。
例外が嫌なら書き込み後にof.bad()とかof.fail()とか見ればいい。

279 名前:242 mailto:sage [2008/09/15(月) 17:40:36 ]
ソリューション構成をReleaseにしてみたら知り合いに送ったところ実行できたそうです。
皆様ありがとうございます。

280 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:53:59 ]
>>270
ポインタのメンバをディープコピーするTESTのコピーコンストラクタをきちんと書くこと。

281 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:20:58 ]
このプログラムで値が変わるのはなぜですか?

main(){
char a[]="マルチバイト文字列 mbs の sz 文字分をワイド文字列に変換します。";
wchar_t b[300];

cout<<strlen(a)<<endl;
MultiByteToWideChar(CP_ACP, 0, a, n, b, 300);
cout<<wcslen(b)<<endl;
}

282 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:28:54 ]
自己解決しました

283 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:46:12 ]
自己解決しませんでした。 値が変わります? なぜですか?


int m,n;
char a[]="マル"; wchar_t b[300];
n=strlen(a); mbstowcs(b,a,n);
m=wcslen(b); wcstombs(a,b,m);
cout<<n<<" "<<m<<" "<<strlen(a)<<endl;




284 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:50:03 ]
自己解決しました

285 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:08:59 ]
chatとw_charの変換はWindows APIのほうが鈍いようです。
 
#include <windows.h>
#include <time.h>
#include <iostream>
using namespace std;

main(){
int m,n,r,k;
char a[500]="マクロの動作は、有効になっているコンパイラ ディレクティブによって異なる。変換元と変換先の型が同じ場合は変換は行われない。コンパイラ ディレクティブでは、T および OLE を次のように変換する。";
wchar_t b[500];
n=strlen(a); mbstowcs(b,a,n+1);
m=wcslen(b); wcstombs(a,b,m+1);

int cl=clock();
for(k=0;k<1000000;k++){
r=MultiByteToWideChar(CP_ACP, 0, a, n, b, 500); b[r]=0;
r=WideCharToMultiByte(CP_ACP, 0, b, m, a, 500, NULL, NULL ); a[r]=0;}
cl=clock()-cl; cout<<cl<<endl;

for(k=0;k<1000000;k++){
mbstowcs(b,a,n+1); wcstombs(a,b,m+1);}
cl=clock()-cl; cout<<cl<<endl;}

286 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:34:51 ]
MultiByteToWideCharの使い方が間違っているからです

287 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:44:31 ]
正しい使い方はどうすればできますか

288 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 10:03:56 ]
MSDNをよく読む

289 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 12:28:05 ]
サイズが決まっていないchar*型の文字列が10個ていどあって
一致する文字が存在するか見つける高速な方法はSTLのmapですか。
一番速い方法教えてください。 あと元データは削除、追加可能でお願いします。


290 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 12:32:39 ]
Double-Arrayていうのがありますが、単語数は少ないので、そんな最新技術はいらないし、速く見つかる方法がいいです。



Double-Array は Trie を表現するためのデータ構造です. ハッシュ木, デジタルトライ, パトリシア木, Suffix Array による
擬似 Trieといった 他の Trie の実装に比べ高速に動作します.
オリジナル の Double-Arrayは, 動的に key の追加削除を行えるような枠組ですが,
Darts は ソート済の辞書を一括してDouble-Array に変換することに機能を絞っています.
chasen.org/~taku/software/darts/

291 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:49:12 ]
hashmapはそれほど速くないです。
#include <windows.h>
#include <iostream>
#include <map>
#include <hash_map>
#include <string>
#include <vector>
using namespace std;

map<string,int> stlmap;
hash_map<string,int> hashmap;
vector<string> vec;
string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++) str+=(char)(97+rand()%3); return str; }


int main() {
int i,cl; pair<string,int> p;
for(i = 0; i < 100; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);vec.push_back(p.first);}

int n=0; string searchword(strgen());
#define N 500000
// 空のループ
cl=timeGetTime();for(i = 0; i < N; i++) ;cl=timeGetTime()-cl; cout<<cl<<endl;
// STLmap
cl=timeGetTime(); for(i = 0; i < N; i++) stlmap.find(searchword); cl=timeGetTime()-cl; cout<<cl<<endl;
// STLport_hashmap
cl=timeGetTime(); for(i = 0; i < N; i++) hashmap.find(searchword); cl=timeGetTime()-cl; cout<<cl<<endl;
// Vector
cl=timeGetTime();
for(i = 0; i < N; i++)for(int j=0;j<vec.size();j++)if(vec[j]==searchword)break;
cl=timeGetTime()-cl; cout<<cl<<endl;}

292 名前:十分速いじゃん… mailto:sage [2008/09/16(火) 16:25:57 ]
#include <iostream>
#include <map>
#include <stlport/hash_map>
#include <string>
#include <vector>
#include <boost/progress.hpp>
using namespace std;
map<string,int> stlmap; hash_map<string,int> hashmap; vector<string> vec;
string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++) str+=(char)(97+rand()%3); return str; }
int main() {
int i,cl; pair<string,int> p;
for(i = 0; i < 100; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);vec.push_back(p.first);}
#define BEGIN { boost::progress_timer t;
#define END }
int n=0; string searchword(strgen());
#define N 500000
BEGIN;for(i = 0; i < N; i++) ;END; // 空のループ
BEGIN; for(i = 0; i < N; i++) stlmap.find(searchword); END; // STLmap
BEGIN; for(i = 0; i < N; i++) hashmap.find(searchword); END; // STLport_hashmap
BEGIN; // Vector
for(i = 0; i < N; i++)for(int j=0;j<vec.size();j++)if(vec[j]==searchword)break; END;}
g++ hashmap.cxx -I /usr/include/stlport/ -lstlport -O2
% ./a.out |tr "\n" " "
0.00 s
0.66 s
0.17 s
4.95 s

293 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 16:35:30 ]
訂正: -O2 -> -O0



294 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 17:15:34 ]
unordred_mapのがいいよ多分

295 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 17:35:55 ]
unordred_mapきはなかなかですね。 
#include <iostream>
#include <map>
#include <hash_map>
#include <string>
#include <vector>
#include <unordered_map>
#include <time.h>
using namespace std;
map<string,int> stlmap;
hash_map<string,int> hashmap;
tr1::unordered_map<string,int> unorderedmap;
string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++){int r=rand(); str+=(char)(97+r&3)+(char)(97+(r>>2)&3);} return str; }

int main() {
int i,cl; pair<string,int> p;
for(i = 0; i < 10000; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);unorderedmap.insert(p);}

int n=0; string searchword(strgen());
#define N 500000
// 空のループ
cl=clock();for(i = 0; i < N; i++) ;cl=clock()-cl; cout<<cl<<endl;
// STLmap
cl=clock(); for(i = 0; i < N; i++) stlmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;
// STLport_hashmap
cl=clock(); for(i = 0; i < N; i++) hashmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;
//unorderedmap
cl=clock(); for(i = 0; i < N; i++) unorderedmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;}

296 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 18:02:46 ]
GoogleCode sparse_hash_map GoogleCode dense_hash_mapのインストール方法が判りません。 教えてください。
ここのコードがコンパイルしたいです。 BCC2009かVC++2008のやり方判りたいです。


articles.blog79.fc2.com/blog-entry-25.html

297 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 18:16:27 ]
なんにもいれずにそのコードを実行しようとしてるようなレベルですか?

298 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 19:07:44 ]
VC2008のhash_mapはstdext名前空間に入ってるのか
コンパイルできずにしばらく悩んだ
それにしてもDinkumwareは遅い・・・

299 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:05:05 ]
>>298
SP1当てればstd::tr1::unordered_mapも使えるよ。
もちろん性能は変わらないだろうけど。

300 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:59:36 ]
ある変数に連動して、複数のvectorのサイズを変更できますか?
自分で増減させると面倒です。

301 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:02:40 ]
自己解決しました。 tasu(); hiku(); という関数を作ってそこで処理することにしました。

302 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:13:45 ]
関数って良いよね……
造形が凄くソソるよね……

303 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:19:27 ]
free(normal) functionより
major(static) function objectの方がそそります^q^



304 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:34:32 ]
もっと俗っぽくresult_ofよりdecltypeのほうが欲しいな

305 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 02:44:47 ]
a,b,c・・・は0に近い値とし、x,y,z・・・は自然数とします。

このとき、(1+a)^x (1+b)^y (1+c)^z ・・・・の(x+y+z+・・・)乗根を求めたいです。

どのように計算するのが速いでしょうか? 100項目程度あるとします。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<177KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef