C++相談室 part55

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2007/02/01(木) 00:29:03
構造体とクラスって何が違うんでしょうか。
デフォルトでprivateがクラス、publicが構造体くらいしか思いつきません...
953デフォルトの名無しさん:2007/02/01(木) 00:31:07
現状ではそれぐらいの違いしかなかったはず
954デフォルトの名無しさん:2007/02/01(木) 00:35:58
構造体への値の代入をコンパイルタイムで行いたいのだけど
こんなかんじのことをすることはできないでしょうか?

struct a{ float v;}

mpl::map<
pair <char, a.v=8>,
pair <unsigned char, a.v=9>,
pair <int char, a.v=10>,
> type2valuedStr;

at<char,type2valuedStr>::type a_char;

955デフォルトの名無しさん:2007/02/01(木) 00:40:02
c++のコードを貼り付けたホームページを作るのに
いいツールがないでしょうか?
956デフォルトの名無しさん:2007/02/01(木) 00:41:25
<pre></pre>
957デフォルトの名無しさん:2007/02/01(木) 00:42:33
<code> </code>
958デフォルトの名無しさん:2007/02/01(木) 00:46:16
Global…はやりすぎか。
959デフォルトの名無しさん:2007/02/01(木) 00:51:57
>>955
bison と flex を使って、文字への色付けツール作るといいよ。
いい練習になる。
960デフォルトの名無しさん:2007/02/01(木) 01:42:47
それはいったい何の練習だ?
961デフォルトの名無しさん:2007/02/01(木) 01:45:23
すいません、初心者なのですが、
可変長のバイト列のバッファを作りたくて、とりあえず vector<unsigned char> buffer;
としました。
で、ここに unsigned int の変数のデータや unsigned char の配列のデータを
追加したい場合、どうすべきでしょうか?

今はデータを1バイトずつ push_back() とかしてるんですが、あまりにベタだと思うんで、
もしかして STL の範囲でもっと楽にできたりしますか?
buffer をメンバに持つ、複数の型を push_back できるようなクラスを作るというのは
おおげさですかね?
962デフォルトの名無しさん:2007/02/01(木) 01:47:55
とりあえずキャストしてback_inserterにcopyすれば通らない?
963デフォルトの名無しさん:2007/02/01(木) 01:55:25
memcopyしちゃえよYOU!
964デフォルトの名無しさん:2007/02/01(木) 02:06:49
>>961 insert()
965デフォルトの名無しさん:2007/02/01(木) 02:15:35
vector<T>::insertはvector<T>::iteratorあるいはconstT&しか引数に取らないと思っていたが。
966デフォルトの名無しさん:2007/02/01(木) 02:17:57
>>965 VC6 ユーザー乙
967デフォルトの名無しさん:2007/02/01(木) 03:02:20
アレッ? insertでどうやって入れるの?
968デフォルトの名無しさん:2007/02/01(木) 03:09:18
テキストファイル全行を、std::vector<std::string>またはstd::vector<char *>またはchar **等に1行ずつ格納したいのですが、
どうするのがいいのでしょう。
改行コードが現れるまで1文字ずつfgetcで読んでいって長さを測り、
メモリに格納していくという感じになるのでしょうか。
istream等を使うと楽に書けますか?
BCBのVCLでいう、TStringListと、そのLoadFromFileみたいなのを書きたいのですが。
969デフォルトの名無しさん:2007/02/01(木) 03:11:20
>>968
std::getline
970デフォルトの名無しさん:2007/02/01(木) 08:54:22
>>967
unsigned int uint;
unsigned char uchar[N];

vec.insert(vec.end(), reinterpret_cast<unsigned char*>(&uint), reinterpret_cast<unsigned char*>(&uint) + sizeof(uint));
vec.insert(vec.end(), uchar, uchar + LEN);
971デフォルトの名無しさん:2007/02/01(木) 09:50:24
vectorの要素への参照(ポインタ、イテレータ)を取得した後にpush_backなどが起こりうるので悩んでいるんですが、
思いつく対処法は以下しかなく、どれも困難です。定石などがありましたら是非ご教授下さい。

・要素への参照を取得する前にresave()、
 push_backされる要素が幾つあるかが分からないので困難。

・思い切って参照ではなく添え字を記録しちゃう、
 でも何か違うような気がする。
972961:2007/02/01(木) 10:04:44
なるほど、insert でできるんですね。

>>970
ついでにお聞きしてしまうんですが、このように vector の insert やコンストラクタの
引数に2つのポインタを渡して動くのが、ちょっと理解できてないんですが...

vector のメンバにには、普通のポインタの引数を取る型のものってないですよね?
で、デバッガで追うとどうも2つのイテレータの値をもつタイプの関数が呼ばれている
ようなんですが、テンプレートに渡した型のポインタはイテレータと同一視できる
という事なんでしょうか?
かなりアホなことを聞いているかもしれませんが...
973デフォルトの名無しさん:2007/02/01(木) 10:27:23
>>971
・思い切って list にしちゃう
974デフォルトの名無しさん:2007/02/01(木) 10:29:14
>>972
ポインタはイテレータとしての要件をすべて満たす。
イテレータというコンセプトのモデルであるとも言う。
975デフォルトの名無しさん:2007/02/01(木) 14:32:44
ポインタを模倣するようにイテレータが設計された
ってこれ歴史常識じゃないのか…
976デフォルトの名無しさん:2007/02/01(木) 17:29:23
>>955
source highlight
977デフォルトの名無しさん:2007/02/01(木) 20:01:55
継承関係にある2つのクラスがあるとして
 class base {};
 class derived : public base {};
派生クラスのコンテナのイテレータを
 vector<derived*> v;
 vector<base*>::iterator i = v.begin();
のように基底クラスのコンテナのイテレータに自動的に変換して欲しいと
感覚的には思うんですが、なぜそうなっていないのでしょうか???
978デフォルトの名無しさん:2007/02/01(木) 20:14:58
思わねーよそんな行為
979デフォルトの名無しさん:2007/02/01(木) 20:20:07
>>977
それができたら、コンテナにいろんな型を混在
させることが出来ちゃうからじゃないか?
980デフォルトの名無しさん:2007/02/01(木) 20:37:27
>>977
それは駄目だろう。
例えば、こういうのもあったときに
class derived2 : public base{};

vector<derived*>v;
vector<base*>::iterator i = v.begin();
が出来たら

*i = new derived2;
と書けてvector内の型安全性が損なわれる。
981977:2007/02/01(木) 20:51:53
 *i = new derived2;
で型安全性が損なわれるという理由がよく分からないです。
 base* p = new derived1;
 p->func();
 delete p;
 p = new derived2;
 p->func();
 delete p;
↑これは普通ですよね。
↓これも
 void func(base* p) {}
 derived1* p = new derived1;
 func(p);
駄目な例があると分かり易いんですが…。
982977:2007/02/01(木) 20:54:55
>>980
すみません。示していただいた例を誤解していました。
>>981はなしで。もう少し考えます。
983977:2007/02/01(木) 21:04:00
>>979-980
理解しました。
 derived* array[10];
 base* p = array[0];
 p = new derived2;
こういうことをしようとしていたんですね(でもこれはコンパイル通るんですね…)
どうもでした〜。
984デフォルトの名無しさん:2007/02/01(木) 21:16:23
結局、ポインタのポインタには、「ポインタの自動変換規則」は適用されない、ってはなしでそ。
985デフォルトの名無しさん:2007/02/01(木) 21:19:07
いわば、イテレータはショボイポインタ
ポインタならDerivedT*にはBaseT*が代入できるが
イテレータはショボイからできない
 例:--相当のことがができるイテレータは
 5種類のSTLイテレータのうち2種類しかない
986デフォルトの名無しさん:2007/02/01(木) 21:26:09
>983
間違ってる。
 derived* array[10];
 base** p = &array[0];
 *p = new derived2;
まだこっちの方が正確。
987977:2007/02/01(木) 21:52:06
>>986
あ!そうですね。
その場合はコンパイル通らないのですね(>>984に書かれているように)。
整合性あるんですね。
988985:2007/02/01(木) 21:52:38
勘違い。977の言っていることが実行できるとすると
derived1,derived2がbaseを継承しているとして
vec<derived1*> v1;
vec<derived2*> v2;
for(vector<derived1*>::iterator it = v2.begin();it!=v2.end();++it){
 //v2のイテレータでv1を処理。これはおかしい
}
989デフォルトの名無しさん:2007/02/01(木) 22:04:14
vc2005EEを使っているのですが、質問があります。

デバッグモードではCPU使用率が20〜35%に押さえられているのですが、
リリースモードにすると使用率が常時100%に跳ね上がってしまいます。

これの原因分かる方いませんか?
もしくは原因究明の方法が分かる方いませんか?
(プロファイラは使えません^^)
990デフォルトの名無しさん:2007/02/01(木) 23:43:42
C++のマクロで引数を省略することはできますか?

下記のマクロをLOG(msg)のように使いたいのですが。。。

#define LOG(msg,level) writeLog(__FILE__,__LINE__,msg,level)

void writeLog(char* f,int line,char* msg,int level=0)
991デフォルトの名無しさん:2007/02/01(木) 23:47:39
>>989
とりあえず環境依存なのでスレ違い。
992デフォルトの名無しさん:2007/02/02(金) 00:07:31
__VA_ARGS__ でググレ

ば多少は使える情報があるかもしんない
ところで次スレは
993デフォルトの名無しさん:2007/02/02(金) 00:22:25
次スレのタイトルはアカデミックなものにして欲しい
994デフォルトの名無しさん:2007/02/02(金) 00:24:49
【アカデミックな】C++相談室 part56++
995デフォルトの名無しさん:2007/02/02(金) 00:25:38

これはひどい
996デフォルトの名無しさん:2007/02/02(金) 00:26:45
tempalte<template<class> class T>C++相談室<part56>
997デフォルトの名無しさん:2007/02/02(金) 00:28:04
#define C++相談室 part56
998デフォルトの名無しさん:2007/02/02(金) 00:31:21
998!!!!
999デフォルトの名無しさん:2007/02/02(金) 00:32:27
999!
1000デフォルトの名無しさん:2007/02/02(金) 00:32:36
5年間2chにいるけど、今まで一度も1000をとったことがないんだよな。
初めての1000、取れますように。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。