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


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

【C++】template 統合スレ -- Part6



1 名前:デフォルトの名無しさん mailto:sage [04/11/25 21:11:32]
C++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。
STLスレッド
Part1 pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 pc3.2ch.net/tech/kako/1026/10267/1026793823.html

【C++】Boost使い集まれ!
pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?)

Generic Programming with C++ Template
pc.2ch.net/tech/kako/1008/10085/1008593126.html
【C++】template 統合スレ -- STL/Boost/Loki, etc.
pc2.2ch.net/tech/kako/1037/10377/1037795348.html
【C++】template 統合スレ -- Part2
pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち)
【C++】template 統合スレ -- Part3
pc5.2ch.net/test/read.cgi/tech/1066493064/ (html化待ち)
【C++】template 統合スレ -- Part4
pc5.2ch.net/test/read.cgi/tech/1083550483/ (html化待ち)
【C++】template 統合スレ -- Part5
pc5.2ch.net/test/read.cgi/tech/1091522597/
関連スレ、その他リンクは >>2-5 あたりに。


554 名前:デフォルトの名無しさん mailto:sage [2005/05/16(月) 22:31:08 ]
>>553
そういう時のためのstd::vectorではないかと思うのだが・・・・

555 名前:デフォルトの名無しさん mailto:sage [2005/05/16(月) 22:34:16 ]
static const uint initialValues[] = {5, 1, 6, 3, 9,};
std::vector<uint> v5 = std::vector<uint>(initailValues, initialValues + sizeof(initialValues) / sizeof(*initialValues));

556 名前:デフォルトの名無しさん mailto:sage [2005/05/16(月) 22:34:58 ]
その例なら
配列を初期化して、std::vectorにぶち込めばいいじゃん
どうしてもやりたいならBOOST_PPで特殊化

557 名前:デフォルトの名無しさん mailto:sage [2005/05/16(月) 23:09:19 ]
部分特殊化。以降略。なんか馬鹿みてえ。
#include <iostream>
#include <cstddef>

template <std::size_t N, typename T = int>
class vec {
T a[N];
public:
vec(T i) {
a[0] = i;
std::cout << a[0] << std::endl;
}
};

template <typename T>
class vec<2, T>
{
T a[2];
public:
vec(T i, T j) {
a[0] = i; a[1] = j;
std::cout << a[0] << ' ' << a[1] << std::endl;
}
};

int main()
{
vec<1> v1 = vec<1>(5);
vec<2> v2 = vec<2>(5,1);
}

558 名前:デフォルトの名無しさん mailto:sage [2005/05/16(月) 23:21:18 ]
特殊化はイヤというか面倒くさすぎるから、普通はこんなカンジだろうね

template<uint Dim> class vector {
double *const coord;
public:
vector(double x) : coord(new double[sizeof(char[Dim == 1]) * Dim])
 { coord[0] = x; }
vector(double x, double y) : coord(new double[sizeof(char[Dim == 2]) * Dim])
 { coord[0] = x; coord[1] = y; }
vector(double x, double y, double z) : coord(new double[sizeof(char[Dim == 3]) * Dim])
 { coord[0] = x; coord[1] = y; coord[2] = z; }
};

int main() {
vector<1> v(1);
vector<1> v1(1, 2); // error
vector<2> v2(1, 2);
vector<2> vv2(1); // error
vector<3> v3(1, 2, 3);
}


559 名前:デフォルトの名無しさん mailto:sage [2005/05/16(月) 23:24:56 ]
やはりコンストラクタのオーバーロードに落ち着くか。

560 名前:デフォルトの名無しさん mailto:sage [2005/05/16(月) 23:25:18 ]
>>
そうするまでもなく
普通に多重定義でいいと思うよ。

template <std::size_t N, typename T = int>
class vec {
T a[N];
public:

vec( T x, T y)
{
if( N > 0 )a[0] = x;
if( N > 1 )a[1] = y;
}

vec( T x, T y, T z)
{
if( N > 0 )a[0] = x;
if( N > 1 )a[1] = y;
if( N > 2 )a[2] = z;
}

};


561 名前:デフォルトの名無しさん mailto:sage [2005/05/16(月) 23:27:04 ]
ちなみに、 sizeof(char[Dim == 1]) ってのは、
Dim == 1 のときは、1 で、そうでなければ、コンパイルエラーね

562 名前:デフォルトの名無しさん mailto:sage [2005/05/16(月) 23:59:25 ]
どうも読みにくいので、直した

template<unsigned Dim> class vector {
 double coord[Dim];
public:
 vector(double x) {
  sizeof(char[Dim == 1]); // Dim == 1 でなければエラー
  coord[0] = x;
 }
 vector(double x, double y) {
  sizeof(char[Dim == 2]); // Dim == 3 でなければエラー
  coord[0] = x; coord[1] = y;
 }
 vector(double x, double y, double z) {
  sizeof(char[Dim == 3]); // Dim == 3 でなければエラー
  coord[0] = x; coord[1] = y; coord[2] = z;
 }
};

int main() {
 vector<1> v(1);
 vector<1> v1(1, 2); // コンパイルエラー
 vector<2> v2(1, 2);
 vector<2> vv2(1); // コンパイルエラー
 vector<3> v3(1, 2, 3);
}




563 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 02:55:12 ]
おまえらの必死さに笑った。
C++の中途半端なtemplate機能でメンテ不能の駄作を量産してる様は、
まるでVBで汎用ライブラリを作る馬鹿とそっくりだな。

564 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 02:57:49 ]
×メンテ不能
○俺に理解不能

565 名前:デフォルトの名無しさん [2005/05/17(火) 07:37:28 ]
あーあ、4,5,6って別々にするわけ?テンプレの意味ねー

566 名前:デフォルトの名無しさん [2005/05/17(火) 07:41:46 ]
テンプレートはマクロ
www.iba.k.u-tokyo.ac.jp/〜yanai/template_tips.html

567 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 10:05:48 ]
>>563
まあ同意。boostとか見てても思うが、言語使用の範囲内でどうにかしようとするから無理が出てくる。
パズルとしては興味深いが、無理やりやってるからどうしてもキモくなる。
新しいプリプロセッサ作ったほうがマシな気がする。

568 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 12:24:00 ]
>>566
典型的なアホっぽいが。

exportはComeauでサポートされていることすら知らんようだし。

569 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 12:40:07 ]
>>566
> まず最も重要な事実は、templateはマクロであるということである。
そもそも、始めの仮定についてキチンと論証してない時点でアウトだな。


570 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 13:16:28 ]
templateはマクロだよ。
マクロと聞いてCやC++のプリプロセッサ(やVBAなどアプリケーション内のスクリ
プティング言語)しか思いつかない人に向けた文章ではなかろ。



571 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 14:01:12 ]
>ここではオブジェクト指向に則ったよいtemplateの使い方を模索する。
この時点で道を誤っている気が。

572 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 14:29:53 ]
templateの明示的インスタンス化なんて、少し考えれば
使い道などろくに無い機能だとわかるだろうに
しかも使う必要も無い機能だし
それにこだわってる時点で、ダメだなそのページ



573 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 18:56:42 ]
ネタをまじめに叩くなよ

574 名前:デフォルトの名無しさん [2005/05/17(火) 20:39:55 ]
ねたじゃねーし
templateはコンパイルする前に展開されるからマクロなの

575 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 20:42:50 ]
コンパイルする前に展開しちゃったら
タイプセーフは無理じゃないの?

576 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 20:47:38 ]
いいよわからん奴は無理に使うな

577 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 21:03:14 ]
マクロで使える構文を限定的にして型を認識させたのがテンプレート

578 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 21:12:28 ]
みんな好き勝手に「マクロ」の意味を定義して使ってるから、話が噛み合わない
だけでしょ。

579 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 21:56:51 ]
おっと、ここで578が正式にマクロの定義とやらを教えてくれるらしいぞ

580 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 22:03:42 ]
なにこの意味不明な反応

581 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 22:21:02 ]
付き合うだけ無駄でつ

582 名前:デフォルトの名無しさん [2005/05/18(水) 07:21:54 ]
普通のマクロでも引数の数を変えられるようなことはできないから
>>553



583 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 00:28:48 ]
VC7.1で
std::list<int>使うとポインタの保存のためか
std::vector<int>の3倍近いメモリ使うんだが、
省メモリな実装のlistって無理なのかな?


584 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 00:55:57 ]
>>583
SGI STLのstd::slistなら、一方向リストだけど、少しでも少ないかも。

585 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 01:45:41 ]
リストすら作りを理解してないのかよ。


586 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 12:25:58 ]
std::vectorのresizeコストが気になるようならstd:;dequeとか

587 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:07:18 ]
つうか双方向リストは最低2つはポインタが必要なんだから当たり前の気がするんだが

588 名前:583 mailto:sage [2005/05/21(土) 00:47:56 ]
サイズは可変で大きい、挿入削除が定数時間(->list)、省メモリ(->vector)
を同時に満たしたかったので...
とりあえず挿入削除の速いlistを選択したけど、以外とメモリ食うって分かった。

小規模のvectorをlistで繋ぐか584さんのslistつかうのがいい気がしてきた。
双方向リストだとポインタが64bit化したらさらに事態は悪化するのも気になるし...


589 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:53:20 ]
だから小規模なvectorをつなぐぐらいならdeque使えってばよ

590 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:54:03 ]
>>587
要素が int で、双方向のポインタがあるわけで
それぞれサイズが同じなら、int の 3倍ですね。
>>585 も指摘してますが、糞当たり前です。

591 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:54:46 ]
>588
データ構造の勉強からやり直して来い。

592 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:55:27 ]
s/int の/1要素あたり int の/



593 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 00:56:22 ]
>>588
中身の小さいオブジェクトを入れると、相対的にlistはポインタなどの管理部分が
大きく見えてしまうからねえ。
ケースバイケースで使い分けるしかない。
それとstd::slistのiteratorは、forward iteratorなので、bidirectional iteratorのlist
に比べると実行効率の悪いメンバ関数がいくつか存在するから、その点もよく確かめてね。

594 名前:583 mailto:sage [2005/05/21(土) 01:04:49 ]
dequeだと
中間への挿入、削除した場合に
参照と反復子が死滅。



595 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:05:46 ]
>>588
テキストエディタみたいに、挿入が同一箇所に連続して発生するようなら
ギャップベクタを検討するといいかも

596 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:34:23 ]
>>594
それが問題になるなら、もう list しかないんじゃないかなぁ。
「小規模のvectorをlistで繋ぐ」なんてのも、全然ダメだろ。

597 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:43:48 ]
もはやtemplateの話題じゃなくて、「データ構造とアルゴリズム」の世界だな。

598 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 02:11:25 ]
listとかvectorはあるのに、より優れた概念のS式がないのはおかしい

599 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 03:42:02 ]
>>598
あなたね(汗
インタプリタじゃないんですから。

600 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 05:55:52 ]
>>599
もっと詳しく。

・・・って言っても無駄か。
何もわかってないくせに噛み付いてるの見え見えだもんな。

601 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 08:25:20 ]
S式ってツリー構造じゃ無かったっけ?違った?

602 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 08:41:31 ]
>>600
赤黒木だけじゃ足りないってのかい。



603 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 09:18:31 ]
>>597
STLネタがそっちに向かうのは自然だと思うけど?

604 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 09:22:59 ]
> つうか双方向リストは最低2つはポインタが必要なんだから当たり前の気がするんだが
直前の要素のポインタと直後の要素のポインタの排他的論理和演算結果を保持しておけ。
そうしておけばポインタ1つで双方向からリストをたどることができる。

実行時にそれなりのコストはかかるが、、、

605 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 10:01:07 ]
>>604
結局サイズは変わらないわけだが。
しかも「ポインタ同士のXOR」?ワケワカラン。

606 名前:604 mailto:sage [2005/05/21(土) 10:23:45 ]
以下のようなリンクリストがあったとする。

A‐B‐C

この時、B のポインタ領域には &A ^ &C となる値がセットされることになる。
順方向でA、Bまで読み込んできた場合、Aのアドレスは判っているはず。
このため、&A ^ (&A ^ &C) を計算することでCのアドレスが取得できる。

同様に逆方向でC、Bまで読み込んでいる場合、Cのアドレスは判っているため、&C ^ (&A ^ &C) を計算することでAのアドレスが取得できる。

これが magic list というデータ構造。


607 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 10:35:12 ]
>>606
代償としてイテレータのサイズが大きくなるから、使い道は微妙だけどな。

608 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 10:43:01 ]
>>606
ふーん。
std::list の実装に使われてるのは見たこと無いんだけど、
標準コンテナの実装としては何か問題があるのかな?

と考えたら、イテレータを取得した後に要素の削除・追加をするとマズイような気がした。

609 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 10:44:00 ]
>>604
リストを変更しないときのコストはたいしてかからないんじゃないか。
簡単なループの場合、movl (%eax),%eax が xorl (%eax),%eax になるだけだろう。

>>607
イテレータのサイズなんて問題になることがそうそうあるとは思えんが。

前後に追加削除があるとイテレータが無効になってしまうから
std::listとはコンパチにならなくなることの方がまだ問題になりそうだ。


610 名前:604 mailto:sage [2005/05/21(土) 10:50:55 ]
>>607
イテレータのサイズとリンクリストに保持される各要素のデータサイズを同列で比較するのもどうかと思うが。

イテレータにポインタを2つほど追加したところで、8バイトしかサイズは増えない。
(処理が複雑化する分、イテレータオブジェクトのサイズはもう少し増えると思うが。)
しかし、双方向ポインタにしてしまうと、各要素毎に4バイトの投資が必要となる。


611 名前:604 mailto:sage [2005/05/21(土) 10:58:43 ]
>>608>>609
確かにイテレータの取得後に前後の要素が追加削除されると痛い。
排他制御の問題を抱え込むから、std::list との互換性は考えない方が吉かと。

612 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 11:12:46 ]
>>609
> 簡単なループの場合、movl (%eax),%eax が xorl (%eax),%eax になるだけだろう。

訂正。これ間違い。xor+mov*2(or xchg)になるな。






613 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 00:18:22 ]
> サイズは可変で大きい、挿入削除が定数時間(->list)、省メモリ(->vector)
データの格納にset使うのってやっぱダメなのか?
setの中身はconst扱いだけど、外してswapして取り出して消して使ってるけど。
挿入時もヌルデータ入れて跡で要素をswapしてるんで無駄なコピーも出ない用に工夫して、、、
、、、、

vectorはサイズ増えると勝手に自分のコピー作るんで、reserveしなきゃならんので嫌だ。
lispは探索が遅いし。mapはそんなものに使うのもったいないし。

結論 : set使え!

614 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 00:31:16 ]
setが泣いてるぞ

615 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 00:31:37 ]
listのメモリ効率が気になるような状況でsetなんか使えるかよ
つーか、dequeって要素へのアクセスもそこそこ速くサイズ変更のコストも最小限なのになんで使われんのか。

616 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 03:41:02 ]
>>615
dequeって要素へのアクセスもそこそこ速く
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
環境によってはlist並みに遅いわけですが何か?
OSやCPUは敢えて書かないが、STLportとかSTLportとかSTLportとか。

617 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 06:50:59 ]
>>606
C++ でポインタにビット毎の論理演算なんて
吉外じみた真似、よく平気で出来ますね。

618 名前:604 mailto:sage [2005/05/22(日) 08:36:41 ]
>>617
坊やだな、、、
ポインタと言えど所詮はビット列なのだよ。

619 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 08:39:59 ]
>>618
reinterpret_castとか使わないといけないんだろ?
環境依存イクナイ(・A ・)!

620 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 08:55:43 ]
>>606
面白いなぁ

621 名前:604 mailto:sage [2005/05/22(日) 08:55:52 ]
>>619
reinterpret_castが即、環境依存につながるとは新鮮な考え方だな。
同じ環境内でキャストして、同じ環境内で元に戻すのであれば、環境依存も何もないだろうに(それを環境依存というのなら、コンパイラが吐くコードはすべて環境依存になるぞ)。
それとも、そういうことすら期待できない処理系が現存するというのか?
(そんなのが出てきた時点で reinterpret_cast は言語仕様から外されるだろうて。)

622 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 09:07:29 ]
>>621
愉快な香具師だなお前。
C++の実装と進化の§14.3.3(P420)読んでみろ。



623 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 09:09:30 ]
>>622
○C++の設計と進化
×C++の実装と進化

それから、規格票を優先しろ。

624 名前:604 mailto:sage [2005/05/22(日) 09:17:26 ]
その本は持ってない。
引用の範囲内だろうから、出典を明記して引用してくれ。
内容を咀嚼して説明してくれてもよいぞ。


625 名前:620 mailto:sage [2005/05/22(日) 09:35:20 ]
俺の面白いは純粋な意味であって、622と同じ意じゃないですよ

626 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 09:38:55 ]
5.2.10 Reinterpret cast

4 A pointer can be explicitly converted to any integral type large enough to hold it.
The mapping function is implementation-defined [Note: it is intended to be unsurprising
to those who know the addressing structure of the underlying machine. ]

5 A value of integral type or enumeration type can be explicitly converted to a pointer.
A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value; mappings between
pointers and integers are otherwise implementation-defined.

要するに規格としてはポインタ型を整数型にreinterpret_castして
その値をそのままポインタ型に戻す操作以外は完全に実装依存

627 名前:604 mailto:sage [2005/05/22(日) 09:57:53 ]
「5.2.10 Reinterpret cast」の真意は、整数型にキャストし、演算後の《変更された値》をポインタにキャストし戻したとしても、それはポインタとして無効であるということだけだと思うぞ。
一例を挙げると、配列の特定要素を指すポインタを整数型に変換した後、インスタンスオブジェクトのサイズ分だけ値を加算し、ポインタ型に戻したとしても、次の要素へのポインタにはならないぞ、、、という。

Magic listにおける A-B-C という例において、Bに保存されている値はAのアドレスとCのアドレスを特定のルールで「エンコード」しただけの整数値であり、デコードすることにより元々のポインタ値を復元することが可能なはず(てーか復元できなければ意味はない)。
このため、上記の§5.2.10の規則には抵触しないと思うが?
むしろ「A pointer *can be* explicitly converted to any integral type」と書かれている以上、そのことが保証されているとも取れる。

integral typeにして何の演算も許さず、元のポインタに戻すことしかできないのであれば、そもそもキャストする意味ないし。 まさかシリアライズするのか?、、、ってそれはあまりにも危険だしな。


628 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 10:18:14 ]
>>626
ん?問題ないんじゃない?

同じポインタからは同じ整数になり、
同じ整数からは同じポインタになるっていう射影だよね。
この規格表のいいたいところは要するに、
アドレスが16違っている2つのポインタを、
整数に直した時も16違っているかどうかはわからないよ、
というだけの話じゃん。


629 名前:626 mailto:sage [2005/05/22(日) 10:20:55 ]
>>627
>Magic listにおける A-B-C という例において、Bに保存されている値はAのアドレスとCのアドレスを特定のルールで「エンコード」しただけの整数値であり、デコードすることにより元々のポインタ値を復元することが可能なはず(てーか復元できなければ意味はない)。
>このため、上記の§5.2.10の規則には抵触しないと思うが?
>むしろ「A pointer *can be* explicitly converted to any integral type」と書かれている以上、そのことが保証されているとも取れる。

5.2.10/5はポインタを整数にreinterpret_castした後,その整数値を「そのまま何の演算も行わずに」
元のポインタ型に再度reinterpret_castした場合,元のポインタ値に復元されることを保証するものです.
604さんのmagic_listでは排他的論理和演算を取るため「そのまま」ではないものの
5.2.10/5は明らかにreinterpret_castによるpointer <-> integerの1対1写像を保証しているものと
読めるため確かにそのとおりですね.626は621に対する指摘のつもりでしたが,
いやはや指摘がまったく見当違いどころかむしろ621が正当である根拠になりえますね.
これまた大変失礼しました.

>>628
上に同じです.失礼しました.

630 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 12:18:47 ]
magic list はネタとしては面白いが、現実には滅多に使われない
データ構造だな。この手のネタは Hakcer's Delight とか Knuth
センセの本を読むとイロイロ転がってるよ。

あと、現実のプログラミングだと、list に int 一個だけ入れるのも
珍しい気がする。手元のコードをいくつか見直してみたが、わりと
大きめの構造体を繋ぐか、スマートポインタを入れることが多い。
いずれにしてもポインタ二個分のメモリなんて誤差って感じ。

631 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 13:39:00 ]
珍しいかどうかは、ともかく
メモリ云々行ってた奴は、たぶん初心者だから
初心者の戯言を、あまり真に受けないほうが

632 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 09:43:55 ]
結論はvector使え、でいいのか?



633 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 09:54:29 ]
>>632
いい

634 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 12:40:40 ]
magic list は所詮オナニー

635 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 18:35:46 ]
ここはジェネリックプログラミングの話題じゃないのか?

636 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 00:13:26 ]
>>635
テンプレートの話題ですよ。尤も、スレタイも読めないなら
このレスも読めない可能性、大。

637 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 03:37:35 ]
暇つぶしに作ってた、ヘボコンパイラは出来上がったから
今度は、マジックリストクラステンプレートでも作ってみようかな
作ったらほしい人いる?

638 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 08:09:05 ]
>>637 興味はある

639 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 09:47:05 ]
学術的な興味なら。
ソースより測定結果をみたい。listやvectorとの比較つきで。

640 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 15:44:00 ]
というか作りかけてる・・・

641 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 22:41:55 ]
できたら
>>639もぜひ。

642 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 23:45:11 ]
>>640
637だけど、あなたに任せます



643 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 01:39:21 ]
小規模だけど多次元配列のポインタがどうしても必要で、newも使いたくないから
std::vector<std::vector< ...> >
とかで書いてみたんだけど、4次元ぐらいからコンパイル時間が凄くかかる。
ま、コンパイル時に何がおきてるか想像すりゃ当たり前といえば当たり前だし、
コンパイル時だけの問題なので気にしなきゃいいんだけど、
環境になるべく依存しないで(boostとかは使えないし、VC,gcc両方通す必要あり)、
効率の良い方法がありまつかね。std::deque使ってもかわらなさそうだし。



644 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 01:49:02 ]
>>643
その「多次元配列」のインターフェースを必要最小限に絞って、
pimpl なり抽象インターフェースなりでコンパイル単位を分ける。
基本だな。

645 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 02:06:06 ]
>>644
dクス。
pimplイディオムは詳しくないので、Exceptional C++でも読んでみまつ。

646 名前:640 mailto:sage [2005/05/25(水) 02:46:33 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/458.txt
面倒だったのでBoost使いました.1.32.0が必要です.すいません.
VC++7.1とGCC3.4.2(mingw)でコンパイル確認しています.
勢いだけで突っ走ったので激しく読みにくいコードで申し訳ないです.
イテレータが安定じゃないのでsplice系がイテレータ返さないと
使い物にならないので,イテレータ返すようにしてます.
std::listのインターフェースであと実装していないのはsortと演算子だけです.
でも今日はもう気力残ってません.パフォーマンス測定もしかりです.おやすみなさい.

647 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 04:02:34 ]
void reverse() // throw()
{
head_ = decode(sentry_.code, head_);
}

感動してしまった。

648 名前:デフォルトの名無しさん mailto:sage [2005/05/26(木) 03:43:21 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/468.txt
微妙なバカチョンと例外飛んだときのバグを直しました.多分これで完璧なつもりです.
ただ,相変わらずsortだけ面倒なので実装してないです.
指摘されていたこととは言え,このデータ構造イマイチ利点がぼやけてますね.
特にアラインメントの関係でノードのサイズが普通のリストのそれと
同じになってしまう(32-bitマシンでmagic_list<double>とか)場合もあったりで散々かも.
唯一,647さんが指摘されているように要素順の反転を定数時間でできるのが
大きな特色ですけれど,それがうれしい状況ってあるんでしょうか・・・.

649 名前:デフォルトの名無しさん [2005/06/06(月) 11:28:39 ]
質問です。
「具現化によって生成された実体」 = 「ユーザー定義ではないスペシャライゼーション」
という理解でいいの?

650 名前:デフォルトの名無しさん [2005/06/07(火) 22:08:43 ]
"template テンプレート パラメータ"の意味が理解できないッス。
"Modern C++ Design" P11 の以下のコードなんですけど、

template <template <class> class CreationPolicy>
class WidgetManager : public CreationPolicy<Widget>
{
...
}

ここで template <class> に対して私の頭の中で
シンタックスエラーが発生します

template<class T> // ノーマル
template<> // 特殊化
template<class T=int> // デフォルト引数
template<class T, int=10> // 特殊化とデフォルト引数

というシンタックスは理解できています。
template <class> って何者? 誰か教えてください。

651 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:12:38 ]
省略されてるだけ。
template <class /*T*/>
class foo;

652 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:27:41 ]
>>651
サンクスです。とすると何らかの型を受け取るけど、
その型の情報は無視するよ、っていうことなんですね。
これをもとにもう一回読んでみます。



653 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:32:56 ]
>>650
int f(int i);
int g(int); // これも脳内エラーが出るか?

654 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 00:28:08 ]
>>650

例えば、

template< template<class T, class A> class Vector>
struct hoge
{
typedef T value_t;
};

typedef hoge<std::vector> hv_t;

としても、この時点では”T"はまだ決まってないわけだから
名前付けても使えないのです。
無論、”Vector"もこのままでは使えません。

実際の使用には

template< tempalte<class,class> class V>
struct hoge
{
template<class T,class A>
struct bind
{
typedef V<T,A> type;
};
};

typedef hoge<std::vector> hv;
typedef typename hv::template bind<int,std::allo..>::type
のように使うことになりますね。







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

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

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