C++相談室 part34
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0369デフォルトの名無しさん
NGNG>>360は西村京太郎だろ
0370デフォルトの名無しさん
NGNG技術者の場でそういうネタを持ち込むはやめれ。
0371デフォルトの名無しさん
NGNGいやあ、技術に国境は確固として存在するよ。それに伴う偏見や雑言もね
0372デフォルトの名無しさん
NGNG0373デフォルトの名無しさん
NGNG言語はC++です。
int型の数値をchar型の文字列に変換したいときは
どのような関数を作ればよいですか?
同じように、
double→char
など。
初心者の質問で申し訳ないですが
宜しくお願いします。
0374デフォルトの名無しさん
NGNGchar c = 2;
double d = 3.0;
c = static_cast< char >( n );
c = static_cast< char >( d );
こういうこと?
0375デフォルトの名無しさん
NGNGsprintf()
0376デフォルトの名無しさん
NGNGfgets()
0377373
NGNG374さんが書いたコードは、
int i;
char j;
j = (char)i;
といったかんじの普通のキャストとは
やはりどこか違うんでしょうか?
>>375
sprintfという便利なものが
あったのですね。
とりあえずがんばってみます!
ありがとうございました。
0378デフォルトの名無しさん
NGNGワラタ
暗にマルチポストを指摘しているな。
0379デフォルトの名無しさん
NGNGそういうことなら
ostringstream ってのがある
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それで、オブジェクトの事を詳しく説明しているサイトがあれば、教えて頂けないでしょうか?
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています