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


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

【C++】STL(Standard Template Library)相談室 8



1 名前:858 [2007/12/24(月) 03:41:59 ]
C++標準ライブラリの一つ、STLについて。

前スレ
【C++】STL(Standard Template Library)相談室 7
pc11.2ch.net/test/read.cgi/tech/1185986999/

過去ログ・リンク・書籍紹介は >>2 以降

152 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:38:42 ]
>>151

Effective STL Item9 や JosuttisのSTL本にも載ってるけど
こんな感じだろうか。

bool pred(const pair<int, char>& v)
{
 return v.first == 3 && v.second == 'c';
}

for(multimap<int, char>::iterator it = m.begin(); it != m.end(); )
{
 if( pred(*it) ) {
  m.erase(it++);
 }
 else {
  ++it;
 }
}

試してはいない。

153 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:52:44 ]
>>152
begin()とend()じゃなくて、lower_bound()とupper_bound()の方がいいと思う。

154 名前:149 mailto:sage [2008/01/13(日) 20:56:22 ]
>>152
お示しの方法でうまくいきました。

>151,152
ありがとうございました。

155 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 21:39:07 ]
>>152
折角mapなのに全検索は勿体無くねぇ?

156 名前:149 mailto:sage [2008/01/13(日) 21:47:11 ]
>>153
lower_bound()とupper_bound()
にするのは速度的な問題でしょうか?

しかし、キーを二回余分に渡すのもちょっと面倒ですね。

>>152
一旦キーでマッチしたものを、すべてシーケンスコンテナに入れて
そこからさらに絞り込むっていう方法も考えていたんですが
今、私が書いているコードで使う要素数が多くても3個ほどなので
あまり変わらないような気がしました。
要素が多いとまた変わってくるかもしれません。


157 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 22:04:28 ]
>>153 >>155
確かに。multimapだった。
equal_range()でイテレータの組を取ってもいいか。

>>156
全部の要素をlinerで舐めるのは非効率だわ。
上の人たちが言ってるやり方が効率が良い。


158 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 22:06:48 ]
upper_boundとlower_boundは大小の順にソートシーケンスに
適用するアルゴリズムだ。

std::mapはデフォルトでキー順に既に要素を挿入した時点で
ソートされているのでまさに効率の良い方法。

Cで言うとbinary_search()な。

159 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 22:13:59 ]
>>156
KeyとValueの両方の条件で削除要素を決定するなら
汎用性を考えた場合、Linerになるけど全部舐める
しかないかもな。まあ、今の場合は削除対象を絞る
条件がKeyが3に固定されてるからいいけど。

160 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 23:31:50 ]
>>156
149の通りの条件なら、Key == 3 の範囲をequal_rangeで得て、
その範囲に対して Value == 'c' を消してまわるのが速そう。平均的には、ね。
総要素数に対してequal_rangeの範囲が無視できるだけ小さいならおk。

実際に行いたい条件が149と違う場合は話が違ってくる。
Keyが単一とは限らないとか。...って、>>159に書いてあるか。




161 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:47:18 ]
そういえばmultimapってどういう用途に使ってますか?
mapは連想配列の様に便利に使ってますが
multimapという道具の使い方がいまいち思い浮かばない…。

162 名前:デフォルトの名無しさん [2008/01/14(月) 11:02:35 ]
得点が0〜100点で、名前を要素とする
同一得点は存在するからマルチ

163 名前:161 mailto:sage [2008/01/14(月) 11:07:45 ]
>>162
なる。 70点取った人を羅列その他できますね。 サンクスです

164 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:23:23 ]
>>161
辞書

165 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:25:39 ]
STL限定なら別だけど辞書ならbimapの方がよくね?

166 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:48:17 ]
用途の話しだ

167 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:18:36 ]
「ようとのはなししだ」ですか?

168 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:19:33 ]
>>167
辞書引け

169 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:19:40 ]
とりあえず度数分布表以外にも例挙げてよよよ

170 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:21:26 ]
>>168
辞書ならbimapの方がよくね?



171 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:22:53 ]
用途の話だ。

172 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:46:33 ]
>>162
この例で、0点のダメ男君が何人いるかと、
その名前の列記とかってどうやって出力するの?
mismatch()とか使うのかな。
foreachループでフラグ立てながらは勘弁

173 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:59:41 ]
俺ならequal_range

174 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 02:04:41 ]
割と典型的なequal_rangeの出番だと思う。
人数だけが知りたい場合は、countがいいかな。もちろんメンバ関数のほうね。

175 名前:172 mailto:sage [2008/01/15(火) 11:07:03 ]
>>173-174
ありがとうございます。 equal_range、及びcount便利ですね。

説明読んでて、「該当者のいる得点一覧」(無重複の使用キー一覧)の方法に
ぶちあたった。 もうちょい調べてみます。

176 名前:デフォルトの名無しさん [2008/01/17(木) 18:02:56 ]
配列の先頭を指すポインタと末尾を指すポインタのペアを返す
テンプレート関数を作成したいのですが、うまくいきません。
以下のコードはVC++6.0でもBCC5.5でもコンパイルエラーです。
正しい方法を教えてください。

#include <utility>
#include <algorithm>

template <class T, int n>
std::pair<T*, T*> iseq(T a[n])
{
return std::pair<T*, T*>(a, a + n);
}

int main()
{
int x[] = {6, 1, 3, 4, 2};
std::sort(iseq(x).first, iseq(x).second);
return 0;
}

177 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:07:47 ]
VC6やBCC5といった糞コンパイラを捨てる

178 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:09:45 ]
>>176

#include <utility>
#include <algorithm>
#include <iostream>
#include <iterator>

template <class T, int n>
std::pair<T*, T*> iseq(T (&a)[n])
{
 return std::pair<T*, T*>(a, a + n);
}

int main()
{
 int x[] = {6, 1, 3, 4, 2};
 std::sort(iseq(x).first, iseq(x).second);
 std::copy(x, x + sizeof(x) / sizeof(x[0]), std::ostream_iterator<int>(std::cout, " "));
}

179 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:13:54 ]
ああそうだわ、>>178はBCCじゃコンパイルできないよ。
VC6はどうか知らんが、VC7.1やVC8、VC9なら行けると思う。
gcc3.4.5でもOKだった。

180 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:16:29 ]
>>179
bcc5.5.1と5.8.2でコンパイルできたよ



181 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:17:41 ]
BCC5.9.2でも行けるね。

182 名前:176 mailto:sage [2008/01/17(木) 18:25:31 ]
>>178
ありがとうございます。>>180さんがおっしゃるとおり
bcc5.5.1ではOKでしたが、VC++6.0ではダメでした。


183 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:52:19 ]
boost::begin()やboost::end()の実装を参考にしてみれば?

184 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:40:09 ]
>>178がコンパイルできないのは、どこが原因?

185 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:44:49 ]
>>184
iseq(T (&a)[n])

この部分が解析できないフロントエンドを持つコンパイラ。

186 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:06:23 ]
VC6 とか無理だった記憶がある。

187 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:47:01 ]
>>185
T (&a)[n] の仮引数aの型が解らんてこと?
aが配列参照と理解できないってことかな


188 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:59:29 ]
配列参照に対応していないだけ。

189 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 00:54:28 ]
BCCは template で T (&a)[n]とやってあると大丈夫みたいだが
int (&a)[n] のように型を決め打ちされてしまうとコンパイルが
通らなかったような。

templateの特殊化には対応してんのかな。どっかいろんな細かい
部分が標準と挙動が異なるのでSTLportから見捨てられかけたり
boostへの対応度が低かったりする。

190 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 08:37:20 ]
コンパイラ実装者にとってパターンマッチほど面倒くさいものはない。



191 名前:デフォルトの名無しさん [2008/01/18(金) 09:13:16 ]
VC6 はもうそろそろ寝かせてやって,
VC9 使おうよ… Express Edition もあるんだから.

192 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 09:14:58 ]
VC9も色々バグがあってヤヴァイみたいだけどな
STLをやboostを使うならVC8がgccとかも含めて一番安定して使えるかも

193 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 09:35:46 ]
質問です。
equal_range()でvectorの特定の値を検索したいのですが
vectorの要素はマルチキーなのです。
typedef struct{
int x;
int y;
}DATA;
このような感じの場合。
どのようにすればいいのでしょうか?
やはり自分で作らないと出来ないのでしょうか?
宜しくお願いします。

194 名前:193 mailto:sage [2008/01/18(金) 10:30:48 ]
事故解決しました。
第4引数があるんですね・・・。
でもこの引数、ググっても、日本語のページは、4件しかヒットしないや・・・orz


195 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 10:31:00 ]
boost使うなら現状VC8の方がいいだろうが
それ以外バグが問題でVC8使った方がいい
ってあり得るの?

196 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 13:53:30 ]
>>194
STLはそういう使い方しないもん。
structじゃなくて、classにしとけよ。
operator定義できないから、多分比較関数定義出来ないぞ。

検索する値はint型、比較する対象はvector<DATA>のDATAっしょ?
比較関数は定義できても、呼び出し側の引数は等価な型を与えるから無理。
先に比較用のoperator書かないと。

197 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 14:07:07 ]
structかclassかの問題だったのか

198 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 14:21:50 ]
>>196
別にstructでもoperator()は定義できるでしょ。
今はそれはどうでもよくて、strict weak odering条件を満たす
bool operator(const Data&, const Data&);
を定義して、operator(const Data&, const Data&)で
vector<Data>をソートしておいて、eqaul_rangeに同じ
Comparisonであるoperator(const Data&, const Data&)を
渡せばいいんでないのか?

ということを>>193は言ってると思ったんだが。

199 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 14:30:05 ]
× bool operator(const Data&, const Data&);
○ bool operator<(const Data&, const Data&);

200 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 14:46:28 ]
>>198
operator<を定義してたらComparison(>>194の言う第4引数)渡さなくていいんじゃ?



201 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 15:12:36 ]
あれ?structでoperator定義出来たんだ。

202 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 15:18:21 ]
>>200
クラスのメンバーとして定義するなら、そうだね

>>201
structとclassの違いはデフォルトのアクセスレベルだけでしょ。


203 名前:200 mailto:sage [2008/01/18(金) 16:00:31 ]
>>202
なるほど、>>198の言ってることがようやく解った

204 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:15:43 ]
↓って同一?マングル名とかも含めて。

struct xxx {
xxx();
private:
int n;
};

class xxx {
int n;
public:
xxx();
}

205 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:40:30 ]
class はテンプレート仮引数の型として使えるが、struct は使えない、という違いもなくはない。

206 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:44:14 ]
>>205
お、ほんとだ。知らなかった。何か理由あるのかね。

207 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:48:53 ]
typenameでいいじゃない

208 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:49:26 ]
テンプレート仮引数のclassとクラス宣言のclassって意味が違うんじゃないの。
仮引数のclassは型名を表すだけで、そこにclass入れようがstruct入れようが組み込み型入れようが構わないんだから。

209 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:51:53 ]
クラステンプレートを引数にとるときは class しか使えないね。

210 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:57:54 ]
classを使わずにstructを使うメリットって何?
コンストラクタ定義しなくても、メモリサイズ的に変わったりするの?




211 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 14:59:21 ]
簡単なデータの塊を表現する時に struct を使ってる。
struct Point3d { double x, y, z; }; とか。

212 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 15:01:34 ]
構造を保ったままCとインタフェースできる。

213 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 15:11:54 ]
template <template<typename T> class C> //OK
template <template<typename T> struct C> //NG

214 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 15:19:24 ]
template <template<typename T> typename C> //NG

これも書いておかないと片手落ちだ

215 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 16:16:28 ]
>>214
それは常識すぎる。

216 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:29:14 ]
fwrite()でvector<int> vの中身を一気に書き出したいのですが
効率の良い方法はないのでしょうか?

vector<int> v;
fwrite(v, sizeof(int), v.size(), fp);
のような感じで一気に書き出せれば凄くうれしいのですが
これではエラーになります。定義されているoperatorがうまくintのポインタの代わりをしてくれるかと思ったのですが
どうやら無理のようです。

これは、一度個数分ループまわしてintに書き出さないとダメなのでしょうか?


217 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:33:38 ]
&v[0]

218 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:39:03 ]
あるいは &v.front()

好きな方を使え。

次期 C++ だと v.data() で良くなるみたいだが・・・
まだないものは仕方が無い

219 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 00:14:53 ]
>>216
ofstream ofs;

copy(v.begin(), v.end(), ostream_iterator<int>(ofs, " "));
とかではダメなんか?

220 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 00:43:42 ]
fwriteだからバイナリで書きたいんだろ



221 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:07:58 ]
>>220
じゃあostreambuf_iterator使えば?

222 名前:デフォルトの名無しさん [2008/01/21(月) 06:41:18 ]
コンテナの中が連続して配置されていることが
保障されているのはvector だけ?
って,list とかでそんなことできるわけないよな.

223 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 06:55:51 ]
vectorはC配列との互換性のためにわざわざそんな保証をしてるわけですから

224 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 08:23:25 ]
そのために無駄なコピーが発生しまくり

225 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:31:26 ]
std::ifstream fin( "in.bat", ios::binary );
std::ofstream fout( "out.bat", ios::binary );

std::copy(
std::istreambuf_iterator<char>( fin ),
std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>( fout ) );

このコードって超おせーんだけど、なんで??


226 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 12:18:26 ]
>>225
それだとディスク内のin.datにアクセス→ディスク内のout.datにアクセスを何度も繰り返すから、
in.datのデータを一度数キロバイトのバッファに入れてからまとめてout.datに書き込んで
ディスクへのアクセスを減らした方が早いよ。
環境にもよるけど、一度ディスクにアクセスする間にメモリからデータを十万回程度アクセスできる。
読み込みも書き込みもまとめてディスクへアクセスすればシーク時間も節約できる。

227 名前:225 mailto:sage [2008/01/21(月) 13:30:36 ]
>>226
iterator を使うと、fstream へのアクセスが 1 文字ごとに
なっちゃうっていう理解でいいですか?
なんとなく iterator のほうがカッコいいかなって思ったんだけど、
使い物にならんほど遅いので…。

素直に
fstream::read()
fstream::write()
を使えということでFA?


228 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:20:07 ]
つ streambuf_iterator

229 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:58:03 ]
>>228
俺には>>225のコードがstreambuf_iteratorを使っているように見えるんだが。


230 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 15:10:47 ]
吊ってくる…



231 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 15:26:30 ]
低レベル(遅延書き出しなど)でのディスク書き出しはOSの機能
だと思われ。書き出すタイミングも。
streambuf_iteratorを使う(内部的にsgetc, sbumpc, sputcを
使ってる)ということはプログラムレベルでのストリームバッファ
を直接操作してるわけで、ファイルストリームオブジェクトに対して
read、writeを使うと非バッファ操作になるから速くなることは
ないと思える。実測次第だな。
OSのチューニングなりドライバこさえるなりするのも一考。


232 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 19:53:04 ]
これで速くなるのかな
    itpro.nikkeibp.co.jp/article/COLUMN/20080104/290425/

233 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 19:55:10 ]
最新のドラフトを見ると string も連続性を保証するようになるっぽい。

234 名前:225 mailto:sage [2008/01/21(月) 19:58:24 ]
>>231
う〜ん・・・

boost::timer t;
for( int i=0; i < 10; ++i ) {
ifstream fin( "in.dat", ios::binary );
ofstream fout( "out.dat", ios::binary );

copy (
istreambuf_iterator<char>( fin ),
istreambuf_iterator<char>(),
ostreambuf_iterator<char>( fout )
);
}
cout << "iterator=" << t.elapsed() << endl;

t.restart();
for( int i=0; i < 10; ++i ) {
ifstream fin( "in.dat", ios::binary );
ofstream fout( "out.dat", ios::binary );

while( !fin.eof() ) {
char buf[BUFSIZ];
fin.read( buf, BUFSIZ );
fout.write( buf, BUFSIZ );
}
}
cout << "read_write=" << t.elapsed() << endl;

のコードでやったら、iterator=2.093, read_write=0.438で、5倍ほど差がつきました。
環境は WinXP + VC8 です。
まぁ、どうしても iterator 使いたいわけじゃないので、おとなしくread() と write() 使います。

235 名前:デフォルトの名無しさん [2008/01/21(月) 20:54:05 ]
multisetの実装について教えてください。

値の重複を許す二分探索木というのは、どう構成したらいいのかよくわかりません。たとえば、

10
8 12

みたいなところ(10がルートで8と12が左右の子)にもうひとつ10を挿入すると、どういう木になるんでしょうか?
red-black treeでなく、単なる二分探索木の話でよいので教えてください。


236 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 21:34:55 ]
>>234
やっぱりディスクアクセスが頻発するのか。
streambuf_iteratorはstream_iteratorに比べると速いというだけか。

ただ、そのプログラムのread/writeだと正しくファイルがコピーされなかった。
おそらく、fout << fin.rdbuf(); 一行で正しくコピーできると思う。

by VC++ 2008


237 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 21:39:20 ]
>>234
fout.write( buf, BUFSIZ );

がコピーできない原因か。BUFSIZEのゴミまでコピーされてしまう。


238 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 21:56:13 ]
flushみたいな名前の

239 名前:225 mailto:sage [2008/01/21(月) 22:20:19 ]
おお、ほんとだ。
こんな単純なミスをするとはww

ファイルのサイズがBUFSIZの倍数になってたから
正常に動いてるように見えてたみたい

>>236
書き方は rdbuf() が一番簡単ですね。
さっきのコードで
fout << rdbuf();

char buf[BUFSIZ];
fin.read( buf, BUFSIZ );
int n = fin.gcount();
fout.write( buf, n );

でやってみましたが(他の部分は同じ)、
rdbuf=1.375
read_write=0.406
で、速度を気にする場合は read(), write() のほうが早いようです。

簡潔に書きたいときは
rdbuf()
速度が重要な時は
read(), write()
を使う方向でいこうと思います。

240 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:23:42 ]
>>232
あほうすぎる話だなw
こんなのDBの研究者が聞いたら鼻で笑っちまうぜ。
挙句の果てVBかよw



241 名前:デフォルトの名無しさん [2008/01/21(月) 22:29:51 ]
/.J でもさんざん馬鹿にされてる

242 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:30:27 ]
>>239
そうrdbufだと結構遅かったんだよね。
gcount()があったんだ。それ使ったほうが良いよ。
速いに越したことはない。

thx。色々参考になったよ。

243 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:32:50 ]
>>240
DBの検索アルゴリズムはよく知らんが、
アルゴリズムを考えるときに言語使用は関係ないだろ。

それに、どうせ使ってるのはOSのAPIだろうから、VBだろうが、Cだろうが、
呼び出す速度は同じじゃね?


244 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:40:10 ]
「OSの基本機能であるファイル名の検索機能」とやらのアルゴリズムを
そっくりそのままDBに応用しようとは考えなかったんだろうか??


245 名前:デフォルトの名無しさん [2008/01/21(月) 23:05:24 ]
STLの配列にクラスのポインタを入れて使用したいのですけど、
そのようなことって可能なのでしょうか?

246 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:09:31 ]
>>245
コピーしたときに問題がおきるからだめ

たとえば、

class my_class;
vector<my_class*> v1;
vector<my_class*> v2 = v1;

だと、v1とv2の指してる先が同じになっちゃう。
ポインタが(というか、newが)使いたいなら、boost::shared_ptr 使って
入れろ。
boost::shared_ptr でググって、使い方がわからんなら
STLコンテナにポインタ入れるのはあきらめろ。


247 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:10:38 ]
>>245
配列?valarray?
ちなみにコンテナだったら可能だよ。
まあ色々面倒だからスマートポインタ使うか
boostのpointer containerとか。

248 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:12:24 ]
>>246,247
ありがとうございます。
では、早速チャレンジしてみます

249 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:16:08 ]
つーかコンテナにポインタ入れる必要って本当にあるの?
大抵の事ならポインタ入れずに済ませられると思うんだが。


250 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:21:32 ]
ヒープに作成したオブジェクトをコンテナで
管理したい場合もあるんじゃないかな。



251 名前:デフォルトの名無しさん [2008/01/21(月) 23:35:47 ]
 >>235 だれかおながいします・・
とおもったけどスレチガイ?

252 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:39:15 ]
>>244
>「OSの基本機能であるファイル名の検索機能」とやらのアルゴリズムを
>そっくりそのままDBに応用しようとは考えなかったんだろうか??

Windows Index Search の機能らしいので
アルゴリズム自体はそっくりそのままDBです

本当にありがとうございました







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

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

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