1read 100read
2012年4月プログラム57: C++相談室 part94 (972)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
monazilla Part 6 (369)
自動巡回ソフトを作りたい。 (373)
【コボル】COBOL不要論【ただのDSLだよね?】 (331)
C++相談室 part94 (972)
プログラマー的"女の口説き方" (709)
C言語なら俺に聞け(入門編)Part 100 (1001)
C++相談室 part94
- 1 :12/02/18 〜 最終レス :12/05/04
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part93
http://toro.2ch.net/test/read.cgi/tech/1324922431/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.77【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1323692486/
■長いソースを貼るときはここへ。■
http://codepad.org/
http://ideone.com/
- 2 :
- ■基本■
[C++ FAQ]
http://www.parashift.com/c++-faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://en.cppreference.com/w/cpp (英語)
http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
http://www2.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。
- 3 :
- ■Libraries■
[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
- 4 :
- ■Books■
amazon C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
http://www.amazon.co.jp/b/?node=754384
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
- 5 :
- ■Books(Templateまわり)■
Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
- 6 :
- / ̄\
| ^o^ | < はんにんは このなかにいます
\_/
/ ヽ
| | | |
| | | |
|| ||
し| i |J=二フ
.| ||
| ノ ノ
.| .| (
/ |\.\
し'  ̄
_
| / ̄\
 ̄| |
_| ̄ \_/
- 7 :
- お前やろ
- 8 :
- shared_ptr<IHoge> make_hoge(int id) {
switch(id) {
case HOGE0: return shared_ptr<IHoge>(new Hoge0);
case 〜
}
}
上のようにポリモーフィックな返り値を返す関数があるんだけどnewのコストを削りたい
アロケーターを使う他になにかいい手はないですか?
標準で可変長のスタック領域を扱えたりすると便利なんですが…
- 9 :
- 配置new
- 10 :
- make_sharedでnewの呼び出しを2回から1回に減らせる。
- 11 :
- 単純な質問ですみませんが、
何故shared_ptr側にオブジェクトを自動アロケートする
メソッドが無いのでしょうか?
引数でオブジェクトのポインタを渡すよりshared_ptr側で
オブジェクトを生成させた方が安全だと思うのですが?
- 12 :
- >>11
make_sharedがあるから
- 13 :
- >>12
あっなるほど・・・
make_sharedってCustom Deleter使いたい時は
自前でAllocator作るしかないですかね?
- 14 :
- class Hoge {
public:
Hoge(int x);
void func(void) ;
};
template <class Del> class HogeEx : public Hoge {
public:
HogeEx(int x, Del const & del) : Hoge(x), mDel(del) {}
~HogeEx(void) { mDel(this); }
private:
Del mDel;
} ;
shared_ptr<Hoge> p =
make_shared<HogeEx<DelType> >(100, deleter) ;
適当に書くとこんな感じかな
HogeExとmake_sharedはもう少し工夫して汎用化してもいい
- 15 :
- int a[] = {7,0,3,4,0,6};
を
{7,3,4,6,0,0}
のように0を後ろに移動させるようなSTLのアルゴリズムありますか?
- 16 :
- std::remove
- 17 :
- 0を削除するつもりではないならstd::partition
- 18 :
- 順番を保存したいならstable_partition
- 19 :
- stable_partitionでうまいこと出来ました。
- 20 :
- iostreamに関する質問です
自作マニピュレータでストリームのモードを一時的に変えて、元に戻したいのですが
std::ios::dec等、引数の無い書式フラグの戻し方はわかったのですが、
(例えばlong sv_f = setf(ios::hex, basefileld); →自作処理後、最後に setf(sv_f)で戻す)
setfill('0')の戻し方がわかりませんボスケテ、
- 21 :
- removeとpartitionってどう違うんだ?
- 22 :
- なんとなく自己解決したっぽい
ostream::fill()を使うらしいですた、
つまり、次のでおk
ios_base::fmtflags sv_f = stream.setf(ios::dec, ios::basefield);
char sv_ch = stream.fill('0');
stream << setw(2) << s << setw(2) << d << /* ... */ << ends; // 自作処理の一例
stream.setf(sv_f);
stream.fill(sv_ch);
return stream;
- 23 :
- >>21
removeが確実に移動・コピーするのは残す値のみで、除去する値をわざわざ末尾の方に移動・コピーするかは実装依存。
int a[] = {7,0,3,4,0,6};
のときにremoveで0を除去した場合
{7,3,4,6,0,6}
のようになる実装もある。
- 24 :
- >>23
なるほど
- 25 :
- C++ではCと異なり変数宣言をスコープの先頭で行わなくてもよくなりましたが、
あるC++のコードでは、次行で即代入を行うような変数もわざわざ宣言を分けてスコープの先頭に置いていました。
{
int a;
a = some_process();
}
こうすることの意味を私なりに考えてみましたが、
・C言語からの移行・もしくは癖
・コーディングルールによるため
・非POD型との統一のため
・デバッグのし易さ(?)
・表記ミス
個人的には可読性の面からも宣言と初期化をまとめたくなりますが、
int a = some_process();
何か意味があれば教えてください。
- 26 :
- 昔は
int a;と
a = some_process();の間に変数aを使うコードがあったが削除されて無くなった
つまり分けてる意味は特にない
- 27 :
- objective-cの後に習う言語はC++かCだと、どっちがいいですか?
- 28 :
- >>26
特に意味は無いのですね。ありがとうございます。
- 29 :
- (1)(2)のように自由関数を引数とする場合には、&が有っても無くても動作するのに、
(3)(4)のようにメンバ関数を引数とする場合には、&が無いと動作しません。
これはなぜでしょうか?
---------------------------------
struct Test{
void testFunc( ){ cout << "Test::func()" << endl; }
};
void func( ){ cout << "::func()" << endl; }
template<class T>
void XXX( T f ){ f( ); }
template<class T, class U>
void YYY( T obj, U f ){ (obj.*f)( ); }
int main( )
{
XXX( &func ); // (1)OK
XXX( func ); // (2)OK
YYY( Test(), &Test::testFunc ); // (3)OK
//YYY( Test(), Test::testFunc ); // (4)NG
return 0;
}
- 30 :
- そういう仕様だから
- 31 :
- さらに
XXX( **********func );
これでもOKだ
- 32 :
- プログラミングアートの基本テクニックの一つだね
- 33 :
- &付けるのが言語仕様的に正しいんだっけ?
- 34 :
- 普通の関数はあっても無くても良い
メンバ関数は必須
- 35 :
- Cとの互換性のため引き継いだ仕様とC++の仕様
- 36 :
- fprintf(FILE *,・・・) があると思います。
ここの FILE * のところには stdout も使えると思いますが、
この部分に指定するストリームを自作したいのですが、どんな感じにするんでしょうか。
とりあえず手始めに
fprintf したら指定ファイルのほか、同時に stdout にも出力するような拡張ストリーム作りたいです。
- 37 :
- つ[popen("tee specified.file")]
- 38 :
- >>36
方法が無いわけではないけど、出来ないと思った方がいい
標準Cライブラリ(printf系)でなく標準C++ライブラリ(iostream)を使うこと
もしくは単にfprintfを2回(ファイルとstdout)呼ぶ
fprintfに指定するのはOSが管理するファイルディスクリプタなので
介入するには低レイヤーなライブラリを使うか、fprintfを自作関数として置き換えるか
環境依存な方法(ファイルシステムソケットなど)を使うか、など
・・・普通はやらない
- 39 :
- ストリームを自作するならiostream側でやろうぜ
streambufを自作してiostreamに食わせりゃいい
- 40 :
- C++ストリーム形式のライブラリって頑張って作った割にみんな使ってくれなくてちょっと泣きそうになるよね
オペレーターがキモいのはわかるんだけどでも標準なんだから仕方ないじゃんみたいな
- 41 :
- キモいというのもあるけど
printf形式が楽なんだよね
boost::format使えばいいんだろうけど
- 42 :
- フォーマットマニピュレータくらい用意しててもいいのにな
新旧標準出力同士なぜ上位互換的使い勝手は目指さなかったのか
- 43 :
- 演算子オーバーロードが楽しくて
ちょっとはしゃいじゃったんだよ
- 44 :
- 反面教師になったのさ
- 45 :
- boost::formatがC++11に入らなかったのは何でだろう
- 46 :
- いまさら言語内言語風に後戻りとかアホすぎだから
プラグインスクリプトか諦めてC++素直に使い括弧バカで通すほうがマシだわ
- 47 :
- iostreamはオーバーヘッド少な目で拡張性の高い仕組みだと思うけど
<<のオーバーロードはホントはしゃいじゃった感じだな
- 48 :
- stream と vector<bool> は可愛い存在。
- 49 :
- 個人的にはvector<bool>に助けられてる。
- 50 :
- ベクブー使う奴はクズ
- 51 :
- iomanipは補間候補さえ出てくれば問題ないんだけどなあ
- 52 :
- > 個人的にはvector<bool>に助けられてる。
サイズはbool*size()じゃないでしょ?
- 53 :
- ビット配列なんて別クラスでいいのに・・・
- 54 :
- ビットセットあるやん
- 55 :
- ビットセットはいつもなんか忘れてるな
- 56 :
- 実際のブツのできはともかく
論理的な機能と物理的な実装を切り分ける好例ではある
- 57 :
- bitsetはサイズ固定じゃないの
- 58 :
- やるならboost::dynamic_bitsetだな
- 59 :
- サイズ非固定のbitsetって何に使うんだ?
- 60 :
- bitsetすら使う事がないからよく分からない
- 61 :
- 基数変換がちゃんと出来る人は、Bitsetで多倍長演算クラスつくると凄そうだなーと思う。
俺できないから、そういうクラス作るとどうしても無駄が出来る。
- 62 :
- >>59
グラフ構造、論理閉包
- 63 :
- パイプすると一回で読み取れるのがスペースか改行までに
勝手になっているんですけど、改行だけにすることはどうやればできますか?
- 64 :
- まず関数名でも書こうか
- 65 :
- 読み取り関数名ですか?
それなら<<ですけど。
- 66 :
- 訂正
>>でした。
- 67 :
- getline
- 68 :
- ありがとうございます。
- 69 :
- 64ビットアプリのばあい
intの代わりにlong longを使い
floatの代わりにdoubleを使うという選択で
最高のパフォーマンスが出せるという
認識であってますか?
- 70 :
- あってない
- 71 :
- どこがあってませんか?
詳しく教えてください。
- 72 :
- 大きいものを使う必要あるの?
- 73 :
- >>71
ちょっと考えればわかる
解らなければ向いてないから違う業界に行ったほうが君のためだよ
- 74 :
- 業界に入ってないのでわかりません教えてください。
- 75 :
- じゃあ向いてないからやめなさい
- 76 :
- なぜ実測しない
- 77 :
- template<typename T, typename U>
void hoge(const T&, const U&){} //A
template<typename T>
void hoge(const T&, const int&){} //B
template<typename U>
void hoge(const int&, const U&){} //C
template<>
void hoge(const int&, const int&){} //D
BとCを定義すると、Dは特殊化ではないとなりました。
BかCのどちらかを削除するとコンパイルできたのですが
DはAの特殊化なのか、BまたはCの特殊化なのか
どちらですか? (区別する必要性はおいといて)
- 78 :
- こうじゃね?
template<>
void hoge<int,int>(const int&, const int&){} //D
- 79 :
- >>76
わかっているなら教えてくださいよ。
- 80 :
- >>78 なるほど、これならいけました。
引数が2つあるので、Aの特殊化になるみたいですね。
BとCを定義した状態で
void hoge<int>(const int&, const int&){} //D
としたら、特殊化できませんでした。
曖昧な場合は特殊化できないみたいですね。
しかも、どうやっても明示できない状況もあるようです。
- 81 :
- >>71
intの定義を調べましょう
intが32bitだと断定してるところはクソサイトだと思って構いません
- 82 :
- >>81
それは知ってます。
16ビットが32ビットになったときみたいに64ビットになったと思っていたら
32ビットだったという経験をしたからlong longを使うという発想にいたったわけです。
- 83 :
- 本当に調べましたか?
intは「処理系に最適なサイズ」になります
コンパイラ開発者達が最適だと判断したものよりも
long longの方が最適であると思うのならばそちらを使うのも良いでしょう
その際は実測してから使うことを勧めます
- 84 :
- 64bit整数が最適でも32bit整数のほうが速いなんてことはいくらでもある
ケースバイケースで実測する他無い
- 85 :
- intが最速って保証は無かったような…
実測するしかない
- 86 :
- >>82
数値演算の速度と64bitアプリかどうかは無関係
「64bitアプリ」の「64bit」はアドレス空間のこと
int, long long, float, doubleには関係ない
関係あるのはポインタ
- 87 :
- 32bitで2回処理が必要なところを64bit1回で済むなら速くなる
そうでなければ変わらない
- 88 :
- 実測してから使うのは良いけど
その実測も注意が必要だな
仮に算術演算で64bit整数の方が良い性能だったとしても
配列などで要素数が多い箇所を64bit整数にすると逆に性能が劣化するということがあり得る
単純なケースでの実測結果があらゆるケースに適用出来るとは限らないことを
認識しておく必要がある
- 89 :
- > intの代わりにlong longを使い
64bit環境なら、intは64bitにするというのが普通。
処理系によっては、わざと32bitにしてるかもしれん。
じゃあ、64bit環境でのlong longは何bitなのか?
処理系依存だよなぁ、わからん。
> floatの代わりにdoubleを使うという選択で
昔のC処理系の仕様では、内部演算はdoubleで行うことになってた。
floatでの演算には、必ずdoubleとの型変換が介在した。
なので、floatよりdoubleの方が速かった。
今のC++処理系の実装は、知らん。
どっちみち、処理系の実装に依存することに変わりはないわけだ。
- 90 :
- どこの世界の普通だ
- 91 :
- intが64bitの処理系挙げてみろよ
- 92 :
- 64bitでも互換性等の理由からintは32bitが普通だw
ILP64の実例なんて聞いた事無いぞ
- 93 :
- Wikiより
データモデル short int long long long ポインタ 処理系
LLP64 16 32 32 64 64 Microsoft Win64 (X64/IA64)
LP64 16 32 64 64 64 ほとんどのUnixとUnix風OS (Solaris, Linux, etc.)
IP64 16 64 32 64 64 ?
ILP64 16 64 64 64 64 HAL
SILP64 64 64 64 64 64 ?
- 94 :
- IP64って規格違反じゃね
- 95 :
- IP64とか規格で許されないのになんで載せてんだか
- 96 :
- intが64bitだと16bitか32bitのどちらかが
拡張整数作らないと使えないからねえ
- 97 :
- 32ビットだとレジスターにintを二つ入れて並列演算するから
long longより速いなんてことないですよね?
- 98 :
- は?
- 99 :
- ひ?
- 100read 1read
- 1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
【Lisp】プログラミング言語 Clojure #2【JVM】 (430)
日下部陽一著 作ってわかるCプログラミング(第6版) (524)
初心者の俺が初めて覚えるプログラム言語 (459)
スレを勃てるまでもないC/C++の質問はここで 20 (755)
ふらっとVisual C#,C♯,C#(初心者用) Part92 (1001)
Cで書くかアセンブラで書くか・・・ (824)
--log9.info------------------
【DOUBLE-S】死がふたりを分かつまで ▼第9話 (447)
【作/天王寺大】白竜-legend-【画/渡辺みちお】6 (162)
【ヤングマガジン】 砂の栄冠 ★12 【三田紀房】 (506)
小学館の月刊IKKI Part.22 (463)
【デストロ246】高橋慶太郎 22【ヨルムンガンド】 (347)
【師匠覚醒】松本光司彼岸島丸太豚汁148【遂に邪鬼化か】 (1001)
押切蓮介総合 ゆうやみ他 ≪奇っ怪の29≫ (703)
【ナポレオン】長谷川哲也35【陣借り平助】 (667)
【平本アキラ】監獄学園 プリズンスクール 5時限目【ヤングマガジン】 (432)
漫画購入相談所その41 (909)
【無料WEBコミックサイト】ファミ通コミッククリア総合スレ 2 (335)
【女子】鉄風 太田モアレ 7ぬぬぬぬ【総合格闘技】 (544)
【B型H系】さんりようこ総合37 (885)
高橋留美子総合スレ19 (136)
【青木潤太朗】℃りけい。【わだぺん。】 (873)
【ツマヌダ格闘街】上山道郎(兄)総合 9【ゾイド】 (579)
--log55.com------------------
【政治経済】令和床屋談義 町の噂その747
【ヲタ血】市民運動観測所 194ヶ所目【クレンジング】
☆喫茶居酒屋「昭和」玖百玖拾陸日目★
【国民の自衛隊】安倍自民党研究第178弾【今も、揺るがぬ信念】
【審議整理()は】旧民主党系等研究第501弾【サボりの言い訳】
【一枚噛ませろと】旧民主党系等研究第502弾【噛み付く奴ら】
☆喫茶居酒屋「昭和」玖百玖拾漆日目★
【私は】旧民主党系等研究第503弾【青○が好き】