C++相談室 part34
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0381デフォルトの名無しさん
NGNGboostかな?
うわおれc++忘れてる
0382デフォルトの名無しさん
NGNG0383デフォルトの名無しさん
NGNGまた他にもっと良い方法はありますか?
A get( ){
return a;}
const A a = get( );
この方法は値渡しがネックです。
void get( A& a ){
a = b;}
A a;
get( a );
この方法だと2行必要ですし、constが付けられません。
0384383の続き
NGNGreturn a = b;}
const A a = get( );
この方法はオーバーライドした際、バグの元になりやすいです。
例)
A& get2( ){
return get();}
A& get( ){
static A a; // TLSでも可
return a = b;}
const A a = get( );
この方法だとなんだか無駄が多い気がします。
キャッシュミスも起こりそう。
0385デフォルトの名無しさん
NGNGNRV 最適化でググれ。
0386デフォルトの名無しさん
NGNGNRVとは初めて知りました。
自分のコンパイラ(VC)で適用されるのか試してみます。
ありがとうございました。
0387デフォルトの名無しさん
NGNG0388デフォルトの名無しさん
NGNGあれほんとに何も最適化しないもんな。
定数式の最適化位だろ。
0389デフォルトの名無しさん
NGNGclass Personal {
string name, sex, tel, email;
int age;
}
例えば、こんなクラスで、あるときはnameで、あるときはageでソートや検索をしたいという場合です。
operator== や operator< はクラスで1つしか持てないので、別の比較関数(or関数オブジェクト)を用意する必要があると思いますが、
どこで用意するのが管理しやすいでしょうかね・・・。
マネージャクラスを別に作って、そこにstaticな比較関数を持たせるのが一番楽かなと思っているんですが・・・
class PersonalManager {
public:
static bool AgeCompareLessl(Personal &p1, Personal &p2){ return p1.age < p2.age}
;
}
としておいて、
vector<Personal> v;
sort(v.begin(), v.end(), PersonalManager::AgeCompareLess);
これじゃぁ、あんまり頭よさそうじゃないですよね。
もっといい案あったら教えてください。
0390デフォルトの名無しさん
NGNG{
bool operator() (const Personal &p1, const Personal &p2){ return p1.age < p2.age; }
}
vector<Personal> v;
sort(v.begin(), v.end(), PersonalComparator());
0391デフォルトの名無しさん
NGNG○PersonalAgeComparator
0392デフォルトの名無しさん
NGNGttp://www.tietew.jp/cppll/archive/549
0393デフォルトの名無しさん
NGNGそれだとやっぱりメンバの数だけ、関数オブジェクトが出来てしまいますよね。
なんか分散しちゃうのが感覚的に嫌な感じ・・・。
>>392
ありがとうございます。そういう奴がほしかったんです。
templateつかってうまいことできないかなぁと。
とりあえずそこ読んで研究してみます・・・・。
0394デフォルトの名無しさん
NGNGprintf("\x1b[30m");
とか。
VC++.NETを使っています。
0395デフォルトの名無しさん
NGNGhttp://book.mycom.co.jp/user/preview/4-8399-1555-5/index.shtml
この本に日本の未来に光を感じました。
これのC言語版がほしいのですが、どこで売ってるのか教へてください。
おながいします。
はふはふ。
0396デフォルトの名無しさん
NGNG0397デフォルトの名無しさん
NGNGちなみにコーディング規約でsprintf使用禁止になっています。
std::stringにそのようなメソッドはないでしょうか?
0398デフォルトの名無しさん
NGNG0399デフォルトの名無しさん
NGNG0400デフォルトの名無しさん
NGNG#include <iostream>
using namespace std;
int main(){
stringstream ss;
string s;
int n;
cin >> n;
ss << n;
ss >> s;
cout << s << endl;
return 0;
}
0401デフォルトの名無しさん
NGNGメンバ変数ポインタと Boost Bind もしくは Boost Lambda を使う。たとえば名前をキーに
したければ
boost::bind(std::less<string>(), boost::bind(&Personal::name, _1), boost::bind(&Personal::name, _2))
あるいは
using namespace boost::lambda;
bind(&Personal::name, _1) < bind(&Personal::name, _2)
ってな感じで、望みの関数オブジェクトが作れる。
0402デフォルトの名無しさん
NGNG馬鹿な規約ですね。
0403デフォルトの名無しさん
NGNG0404デフォルトの名無しさん
NGNG0405デフォルトの名無しさん
NGNGsprintf 禁止でも snprintf なら OK とか?
0406デフォルトの名無しさん
NGNG0407デフォルトの名無しさん
NGNG>401
ちなみにlambdaなら
using namespace boost::lambda
&_1->*&Personal::name < &_2->*&Personal::name
こういう書き方もできますよ.
0408デフォルトの名無しさん
NGNG0409デフォルトの名無しさん
NGNGstd::cout << "\x1b[30m";
0410>>397
NGNG0411デフォルトの名無しさん
NGNGできないです。
どうすればいいでしょう。
もしかしてVC++についているコマンドプロンプトみたいのを使ってるから?
0412デフォルトの名無しさん
NGNGVC++付属じゃないけどな。
0413デフォルトの名無しさん
NGNGコマンドプロンプトでする方法ないですか?
0414デフォルトの名無しさん
NGNG0415デフォルトの名無しさん
NGNG0416デフォルトの名無しさん
NGNG0417デフォルトの名無しさん
NGNGSTLつかうと(ry
0418デフォルトの名無しさん
NGNGこういうのはどうだ?
http://www.kumei.ne.jp/c_lang/intro/no_58.htm
0419デフォルトの名無しさん
NGNG環(ry
0420デフォルトの名無しさん
NGNGすげ(ry
0421デフォルトの名無しさん
NGNG0422デフォルトの名無しさん
NGNG0423デフォルトの名無しさん
NGNG0424デフォルトの名無しさん
NGNG0425デフォルトの名無しさん
NGNG0426デフォルトの名無しさん
NGNG0427デフォルトの名無しさん
NGNGって話かとオモタ。
0428デフォルトの名無しさん
NGNGfor( int i = 0; i < 10; ++ i ){
...
}
std::cout << i << std::endl;
みたいな風に、for を抜けても i を参照することって許されてるんですか?
0429デフォルトの名無しさん
NGNG0430デフォルトの名無しさん
NGNGマジデスカ…
おのれ VC7.1 …
0431デフォルトの名無しさん
NGNG0432デフォルトの名無しさん
NGNGおぉ、THX!
これやってみます
0433デフォルトの名無しさん
NGNG#define for if (0) ; else ; for
0434デフォルトの名無しさん
NGNGイテレータが2種以上あるとき無力だにょなあ
map::iterator im = m.begin();
for( int i = 0; i < 10; ++i, ++im)...
結局こうなっちゃうし。
俺は古い仕様のままでいいと思うけど。
0435デフォルトの名無しさん
NGNG0436デフォルトの名無しさん
NGNGi<10;
++i, ++im) {}
でいいじゃん
0437デフォルトの名無しさん
NGNGそれ、コンパイル通る?
0438デフォルトの名無しさん
NGNGなら通るんだけどねぇ
0439デフォルトの名無しさん
NGNGテンプレートが16種類もあるんだけど
どれが何用とか決まってんの?
0440デフォルトの名無しさん
NGNG0441デフォルトの名無しさん
NGNGint i = 0, map::iterator im = m.begin();
が、
int i = 0; int map::iterator im = m.begin();
と解釈されちゃうんだね。
forの初期化部には一つの型しか書けないわけか。
0442デフォルトの名無しさん
NGNGmap::iterator im = m.begin;
for (int i = 0; i < 10; ++i, ++im)
{
}
}
0443デフォルトの名無しさん
NGNG0444デフォルトの名無しさん
NGNG禿げしく却下
0445デフォルトの名無しさん
NGNG0446デフォルトの名無しさん
NGNG人にとって
0447デフォルトの名無しさん
NGNGんなアンコモンケースに対応することの方がどうでもいい。
0448デフォルトの名無しさん
NGNGそうか?
つーか現状のfor構文の方に
不備があるだろ、どっちかって言うと。
for()内のカンマをセミコロンに、
セミコロンを別の適当な記号に置き換えれば
無問題になるし意味的にも自然だ。
0449デフォルトの名無しさん
NGNG0450デフォルトの名無しさん
NGNG0451デフォルトの名無しさん
NGNGint main(int argc, char **argv)
??<
printf("%d??/n", argc);
??>
0452デフォルトの名無しさん
NGNG0453デフォルトの名無しさん
NGNG0454デフォルトの名無しさん
NGNGmap::iterator im = m.begin;
int i = 0;}
whlie( i < 10){
...
++i; ++im;);
0455デフォルトの名無しさん
NGNGoperator delete( p );
と、
int* p = static_cast< int* >( operator new[]( 10 * sizeof( int ) ) );
operator delete[]( p );
は何か違いがあるのでしょうか?
あるのなら何を基準に使い分ければいいのでしょうか?
0456デフォルトの名無しさん
NGNGreinterpret_cast ちゃうか?
0457デフォルトの名無しさん
NGNGここ読め。
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-3.html
new int[10]だと10 * sizeof(int)以上の領域を確保しなければならない可能性がある。
0458デフォルトの名無しさん
NGNGint flag = 1;
if (EndChr == "n"){
flag = 0;
}
このような式においてEndChr == "n"がfalseになります。
なぜなのでしょうか?
0459デフォルトの名無しさん
NGNG>>455のような例では両者に領域の違いも何もないということですよね?
new 演算子で配列を確保場合、必要以上の領域を確保する可能性があると。
0460デフォルトの名無しさん
NGNGそもそもoperator newはnewから呼び出される為の物だということを忘れるな。
0461デフォルトの名無しさん
NGNGは?
0462デフォルトの名無しさん
NGNGアドレス比較してるから。char[10] の代わりに std::string 使うか strcmp() で比較。
0463デフォルトの名無しさん
NGNGclass C{ ... };
C* p = static_cast< C* >( operator new( 10 * sizeof( C ) ) );
for( int i = 0; i < 10; ++ i )
new( p[ i ] ) C( ... );
...
for( int i = 0; i < 10; ++ i )
p[ i ].~C();
operator delete( p );
と、
C* p = static_cast< C* >( operator new[]( 10 * sizeof( C ) ) );
for( int i = 0; i < 10; ++ i )
new( p[ i ] ) C( ... );
...
for( int i = 0; i < 10; ++ i )
p[ i ].~C();
operator delete[]( p );
はどっちも正しい?
0464デフォルトの名無しさん
NGNG0465デフォルトの名無しさん
NGNGどちらも正しくないんじゃない?動くとは思うけど。
malloc でも動くけどね。
0466デフォルトの名無しさん
NGNGあ、スイマセン…
new( &p[ i ] ) C( ... );
です
0467デフォルトの名無しさん
NGNGまー確かに、全く平等な条件で選んでた言語かって聞かれると・・・・だな。
市場のデカさは間違いなく判断基準に入ってる。
0468デフォルトの名無しさん
NGNGそれで、オブジェクトの事を詳しく説明しているサイトがあれば、教えて頂けないでしょうか?
よろしくお願いします。
0469デフォルトの名無しさん
NGNGは、人文で言うと、
「文化について詳しく説明しているサイトを教えてください」
くらい、条件が広くて絞り込めない。
0470デフォルトの名無しさん
NGNGC++関連の書籍を扱っている書店に行ける環境ですか?
Amazonなどの通信販売でも構いませんので、
まずは1冊、自分で良さそうと思った本を読破することをお勧めします。
高くて買えないという場合は、立ち読みしちゃうとか図書館を覗いてみるとか。
時にはネット以外の情報源に当たるのもいいですよ。
0471デフォルトの名無しさん
NGNGえっと、オブジェクトの事で知りたいのは、オブジェクト=オブジェクトとか、
クラスで、メンバ関数の引数でオブジェクトでの参照渡し、値渡しです。
0472デフォルトの名無しさん
NGNG0473471
NGNG0474デフォルトの名無しさん
NGNGchar hoge[256] = {0}; // hoge文字列の初期化
この書き方って一般的でない?
レビューで「わかりにくい」と言われてしまったんだけど。
#memsetやるより良いと思うんだけどなぁ・・・
0475デフォルトの名無しさん
NGNG0476デフォルトの名無しさん
NGNGhoge[0]='\0';
特に意味が無いのならこうすべきだ。
初期化指定子は無駄な領域も初期化するからな。
0477デフォルトの名無しさん
NGNGこれで
0478デフォルトの名無しさん
NGNGでも構造体配列だと・・・
0479478
NGNG0480474
NGNGchar hoge[256];
hoge[0]='\0';
これってVC6のDebug(Releaseでは大丈夫だった)で起動するとこうならない?↓
hoge[0] : 0x00
hoge[1] : 0xcc
hoge[2] : 0xcc
・・・
hoge[255] : 0xcc
まあ、問題はないんだけど・・・。
0481デフォルトの名無しさん
NGNG0で埋めたいわけじゃないんだろ?
■ このスレッドは過去ログ倉庫に格納されています