【C++】STL(Standard Template Library)相談室 8
at TECH
1:858
07/12/24 03:41:59
C++標準ライブラリの一つ、STLについて。
前スレ
【C++】STL(Standard Template Library)相談室 7
スレリンク(tech板)
過去ログ・リンク・書籍紹介は >>2 以降
2:858
07/12/24 03:42:34
【C++】STL(Standard Template Library)相談室 6
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 5
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 ;4
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 3
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 2
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室
スレリンク(tech板)
3:858
07/12/24 03:43:17
リンク切れとか見てないぞ
入門ページなど
・入門
URLリンク(www.jah.ne.jp)
・入門,一覧,使い方
URLリンク(www5c.biglobe.ne.jp)
・メソッド一覧
URLリンク(www.wakhok.ac.jp)
・サンプルプログラム集
URLリンク(www.s34.co.jp)
・TIPS集
URLリンク(www.nantekotta.com)
・メルマガ
URLリンク(www.kab-studio.biz)
・解説
Wikipedia項目リンク
URLリンク(www-ise2.ise.eng.osaka-u.ac.jp)
マルチスレッドプログラミングの時には
URLリンク(www.logos.ic.i.u-tokyo.ac.jp)
STLPort
URLリンク(www.sgi.com)
URLリンク(www.stlport.org)
4:858
07/12/24 03:43:53
書籍紹介
STL標準講座―標準テンプレートライブラリを利用したC++プログラミング
URLリンク(www.amazon.co.jp)
STL―標準テンプレートライブラリによるC++プログラミング 第2版
URLリンク(www.amazon.co.jp)
標準C++:STLの基礎知識
URLリンク(www.amazon.co.jp)
標準講座C++―基礎からSTLを利用したプログラミングまで
URLリンク(www.amazon.co.jp)
STLによるコンポーネントデザイン
URLリンク(www.amazon.co.jp)
Effective STL―STLを効果的に使いこなす50の鉄則
URLリンク(www.amazon.co.jp)
5:858
07/12/24 03:44:36
関連スレ
C++相談室 part59
スレリンク(tech板)
Boostを語れゴラァ part5
スレリンク(tech板)
C++0x 2
スレリンク(tech板)
6:デフォルトの名無しさん
07/12/24 12:31:41
>>6
スレ立て乙
7:デフォルトの名無しさん
07/12/24 13:43:05
>>1
すれたて乙。 新しいすれでも>>858名乗るのか?
8:デフォルトの名無しさん
07/12/24 16:19:16
std::pair のインスタンスから first および second を
取り出すファンクタは std の下に用意されていますか?
boost::tuples::get<0> みたいなやつを探しています.
自分で定義してもいいんですが,標準的な方法が
用意されているのであればそちらに従いたいと思います.
9:デフォルトの名無しさん
07/12/24 16:32:24
>8
確か標準には無い。
g++だと、#include <ext/functional> して、
__gnu_cxx::select1stとかselect2ndが使える。
10:デフォルトの名無しさん
07/12/24 18:36:58
mem_funのメンバ変数版とかないの?
11:デフォルトの名無しさん
07/12/24 18:43:24
boost::mem_fn
12:デフォルトの名無しさん
07/12/24 19:15:22
ベクタコンテナを初期化子で初期化する場合
vector<int> vec;
Foo::Foo() : vec()
{}
こうしてるんだけど、間違ってない?
13:デフォルトの名無しさん
07/12/24 19:37:34
間違ってはいないけど、要素数0で初期化なら何もしなくてもいい。
14:デフォルトの名無しさん
07/12/24 19:55:05
>>13
サンクス
そこが聞きたかったんだけど、vectorは初期化しなくても使えるのは知ってたけど
どのタイミングで、初期化を行ってるの?
vector型のインスタンスが作成される、手前で初期化をにやってると想像するんだけど
15:デフォルトの名無しさん
07/12/24 19:56:07
コンストラクタが呼ばれるだけですが
16:デフォルトの名無しさん
07/12/24 20:08:36
>>15
なるほど、コンストラクタが呼ばれたら、そこで初期化が行われる仕組みになってるんだ
納得シマスタ
17:デフォルトの名無しさん
07/12/24 20:12:08
どんだけ〜
18:デフォルトの名無しさん
07/12/24 23:47:24
コンストラクタは何の為にあると思ってたんだろう
19:デフォルトの名無しさん
07/12/25 00:08:39
>>17
気持ち悪いです。自殺してください。
20:デフォルトの名無しさん
07/12/25 00:12:46
件のvectorのコンストラクタで質問なんですが、
vectorのオブジェクトを生成するとメモリ割当て子を一つ生成してさらに割当て子を2回コピーしてるようなんですが、
なんでvectorは合計で3つも割当て子のオブジェクトを用意してるんですか?
21:デフォルトの名無しさん
07/12/25 00:16:25
その挙動はコンパイラの実装次第だから何ともいえない。
22:デフォルトの名無しさん
07/12/25 00:16:54
先頭ポインタ、末尾ポインタ、メモリ確保領域の末尾ポインタの3つ。
23:デフォルトの名無しさん
07/12/25 00:19:35
割当て子ってアロケーターの事だと思った。
24:20
07/12/25 00:31:57
レスありがとうございます。
もう一度コードを読見直してみます。
25:デフォルトの名無しさん
07/12/25 00:59:29
見直すってvectorの実装をか?勉強のためなら止めはしないが・・・
その実装がどの環境でも同じかどうかなんて保障はないぞ。
別にお前さんは何も間違っているわけでもなく、そういうものだと理解するんだ。
26:デフォルトの名無しさん
07/12/25 07:45:18
20の場合では、コンストラクタの既定引数の実引数として1つ作られ、
そこから仮引数へのコピー、そこからvectorのメンバ変数へのコピーで2回だろうな。
27:デフォルトの名無しさん
07/12/28 03:26:47
vector<int> vec;
〜
vecに対する処理(入れたり、出したり)
〜
if( !vec.empty() )
erase( remove( vec.begin(), vec.end()) );
コンテナの要素が空でない場合、要素を全削除する関数ですが、これをtemplateに
してもらえませんか、宜しくオナガイシマス
28:デフォルトの名無しさん
07/12/28 03:39:03
>>27
erase() とか remove() とかの使い方がおかしくてよくわからんけど、
それは無条件で全削除する、つまり vec.clear() と何が違うの?
template にすると言われても何をテンプレート引数にするのか決めないと
どうにでもできてしまうよ。 template<int N> ... とか。
29:デフォルトの名無しさん
07/12/28 03:44:46
>>28
サンクスです
vecの型が
vector<double> vecであってもvector<string> vecでも
削除できるようにしたいのですが?
30:デフォルトの名無しさん
07/12/28 03:47:17
ごめんなさい
erase( remove( vec.begin(), vec.end()), 削除したい特定の要素 );
でした
31:デフォルトの名無しさん
07/12/28 03:58:36
>>29-30
情報小出しの兆候が見られて嫌な感じだな。
いくらかわかったけど、細かい仕様がわからないから何ともできない。
たとえば関数テンプレートにしたいんなら関数の戻り値や引数がわからない。
とりあえず自分で書いた奴みせて。
32:デフォルトの名無しさん
07/12/28 05:00:55
>>29-30
こうですかわかりません
template<typename T>
void erase_it(vector<T>& vec, const T& value)
{
vec.erase( remove(vec.begin(), vec.end(), value), vec.end() );
}
33:デフォルトの名無しさん
07/12/28 06:49:01
まだ続々と新情報が出てくるだろうから
しばらく適当にイジってたほうがいいと思うよ
34:デフォルトの名無しさん
07/12/28 18:45:34
>>27です
夕べは眠くて、質問を書き間違えました
>>コンテナの要素が空でない場合、要素を全削除する関数ですが、
これが間違いで
vector型のコンテナで、特定の要素を削除できる汎用的な(Template)の書き方が
教えて欲しかったのです
ですので、32さんありがとう
35:デフォルトの名無しさん
07/12/28 19:12:02
27です、32さんに教えてもらって、Templateの書き方が何となく分かってきた
気がします、連投で申し訳ないけど
コンテナの空チェックで
vector<int> vec;
if(!vec.empty())
vec.clear();
〜空で無い場合の処理
この様な書き方をすると思うのですが、Templateにした場合
この書き方は間違っていますか?
template<typename T>
void empty_it(vector<T>& vec)
{
if(!vec.empty())
vec.clear();
}
36:デフォルトの名無しさん
07/12/28 19:13:18
つーか、vec.clear()だけで充分ですが。
37:デフォルトの名無しさん
07/12/28 19:14:22
>>36
空のコンテナを
vec.clear()すると
アクセスバイオレーションになりませんか?
38:デフォルトの名無しさん
07/12/28 19:16:56
なんでそんなことになると思うの?
39:デフォルトの名無しさん
07/12/28 19:19:50
以前、空のコンテナをclear()したら、そうなった気がしたんですが
今手元に、コンパイラが無いんで確認できないんですが、
勘違いだったのかなぁ・・・
40:デフォルトの名無しさん
07/12/28 19:23:39
>>39
メモリ破壊でもしてたんだろ
41:デフォルトの名無しさん
07/12/28 19:27:46
>>40ってことは、空のコンテナをclear()しても、問題は無いってことですか?
やはり>>35の処理は不要ってこと?
42:デフォルトの名無しさん
07/12/28 19:30:51
>>41
問題ない。不要。
43:デフォルトの名無しさん
07/12/28 19:33:07
>>42了解したよ
ありがとう、幾ら簡単な例ができても、何の役にも立たなくては、意味無いからね
44:デフォルトの名無しさん
07/12/28 21:04:40
解決した途端、敬語が消えてどっかの審査員みたいな目線になるのは
GoFでいうとなにパターンですか?
45:デフォルトの名無しさん
07/12/28 21:08:14
pimpl
46:デフォルトの名無しさん
07/12/29 01:06:28
Observer
47:デフォルトの名無しさん
07/12/29 01:46:38
vector::insert()で、
insert(先頭位置, 挿入数, 挿入する物)
insert(先頭位置, 挿入する物.begin(), 挿入する物.end())
というバリエーションがあるみたいなのですが、どういうバリエーションがあるかは
どうやって知るのでしょうか?manページとかがあるのでしょうか?
48:デフォルトの名無しさん
07/12/29 01:56:47
>>47
こことかどう?
URLリンク(www.wakhok.ac.jp)
49:デフォルトの名無しさん
07/12/29 02:07:58
>>48
ありがとうございます!
50:デフォルトの名無しさん
07/12/29 02:18:00
俺が今仕事で使ってる環境にはstdc++のmanが入ってるな。
ただ所々間違ってるんだけどw
std::mapのerase(iterator position)がpositionの次のiteratorを返すって書いてあったりする。
51:デフォルトの名無しさん
07/12/29 11:30:15
そういや >>47 のようなことを思っていた時期もあったけど,
いまや IntelliSense に頼りっきりになってしまった.
そろそろ趣味グラマで Linux 上でのプログラミングも
しようかと思うんだけど,Emacs でそういう補完とか
やろうと思うとどんな *.el 入れれば便利なんだったっけ?
52:デフォルトの名無しさん
07/12/29 13:46:27
俺はここ使ってる
URLリンク(www.scl.kyoto-u.ac.jp)
53:デフォルトの名無しさん
07/12/30 16:28:45
Linuxとかならglobalかな
emacsには標準でついてる
54:デフォルトの名無しさん
07/12/30 22:31:50
typedef struct ST_TABLE {
int num;
int headdate;
int taildate;
ST_TABLE( ) : num(0), headdate(0), taildate(0){}
}ST_TABLE;
このような、構造体を持つvector型のコンテナから、for_eachを用いて
headdateの最大値を求める、Templateの作り方を教えてもらえませんか
vector<ST_TABLE> containerIndex
containerIndexには、要素が入っていることと仮定して
for_each( containerIndex.begin(), containerIndex.end(), &head );
template<class T>
int head(const vector<ST_TABLE>::iterator T& t) {
ここまでは分かるのですが(間違っているかもしれない。。。。多分間違ってるでしょうorz)
55:デフォルトの名無しさん
07/12/30 22:35:56
間違ってます。3引数のstd::max_elementを使いましょう。
56:デフォルトの名無しさん
07/12/30 22:41:54
これでは、エラーが沢山出てしまうのですが...
for_each( containerIndex.begin(), containerIndex.end(), head );
template<class T>
int head(const vector<ST_TABLE>::iterator T& t) {
return max_element t->headdate;
t++;
}
57:デフォルトの名無しさん
07/12/30 22:49:26
max_element(v.begin(), v.end());
58:デフォルトの名無しさん
07/12/30 22:50:08
>>57 ミスった。スルーしてくれ
59:デフォルトの名無しさん
07/12/30 22:59:05
>>56だけど
できちゃったけど、オーバーロード使って、でできちゃったww
templateでは、できないものかなorz
60:デフォルトの名無しさん
07/12/31 00:54:29
templateで、の意味がいまいち不明だけど、max_element(begin, end, comp)使えって。
61:デフォルトの名無しさん
07/12/31 10:52:36
vector<int> v, w;
があったときにvからwへcopy_ifするとき、wの要素の方が少ないとクラッシュするのですが、
そういうときにもwを拡張しながらcopyするにはどうすればいいですか
たとえば
copy (v.begin(), v.end(), w. begin(), even());
解決方法としてはv.size()であらかじめw.reserveしておくといいのですが、
vは巨大な配列でwは小さいので余計な領域を予約しまくるのが気持ち悪いです
62:デフォルトの名無しさん
07/12/31 11:10:29
自己解決しました。
copy (v.begin(), v.end(), back_inserter(w), even());
ありがとうございませんでした。
63:デフォルトの名無しさん
07/12/31 11:40:20
それだと不必要に非効率になるかも。
w.reserve(w.size() + v.size()) で必要な分のサイズを確保してから、
w.insert(w.begin() + w.size(), v.begin(), v.end()) とやったほうが、
多分(←重要。真相は調べるべき)効率が良い。
64:デフォルトの名無しさん
07/12/31 12:12:24
reserveするだけじゃ実行時エラーになるかも
65:デフォルトの名無しさん
07/12/31 12:36:44
vector<int> vec1
vector<int> vec2
vector<int> vec3に
vec1の要素1,2,3,4,5,6,7,8,9,10
vec2の要素4,5,6
とします、vec1とvec2をマージして、重複値を持たないように
vec3の要素1,2,3,4,5,6,7,8,9,10
としたいのですが、↓これだと
merge( vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), back_inserter ( vec3 );
unique( vec3.begin(), vec3.end() );
vec3の要素1,2,3,4,5,6,7,8,9,10,4,5,6
となってしまいます
どうしたらいいですか?
66:デフォルトの名無しさん
07/12/31 12:47:23
uniqueって、remove_ifなんかと同等のインターフェースで、
vec.erase( remove_if( vec.begin(), vec.end(), cond), vec.end() );
みたいな構成にしないとだめ、じゃなかったっけ。
67:デフォルトの名無しさん
07/12/31 15:49:19
STLじゃないけど
#include <cassert>
#include <pstade/oven/equals.hpp>
#include <pstade/oven/uniqued.hpp>
#include <pstade/oven/merged.hpp>
#include <pstade/oven/initial_values.hpp>
#include <vector>
int main() {
using namespace::pstade::oven;
using namespace std;
vector<int> A = initial_values(1,2,3,4,5,6,7,8,9,10);
vector<int> B = initial_values(4,5,6);
assert( equals(A,A|merged(B)|uniqued) );
}
こんな感じでいちいちeraseだの使わずに書きたい気分
68:デフォルトの名無しさん
07/12/31 16:45:30
>>65だけど
あのぉーすみませんが、pstadeってなんっすか?
boostライブラリィの一種?
69:デフォルトの名無しさん
07/12/31 17:19:44
p_stadeさんの作ったC++ライブラリ
70:デフォルトの名無しさん
07/12/31 17:37:06
かなりマニアティックなものなんですか?
解答が無かったんで、今自力でtemplate作ったけど、速度がでねぇ〜
参ってるんだよね、コンテナ二つがそれぞれ500件と5000件で先の要件を満たす
ようにすると、PCが1,2秒固まるんだよね
p_stadeさんの作ったC++ライブラリって速度速いの?
template < typename ForwardIterator >
ForwardIterator to_unique( ForwardIterator lhs, ForwardIterator rhs )
{
ForwardIterator result = lhs;
for( ForwardIterator it = lhs; it != rhs; ++it ){
if( std::find( lhs, result, *it ) == result ){
*result++ = *it;
}
}
resulturn result;
}
71:デフォルトの名無しさん
07/12/31 18:38:00
sort→unique→eraseじゃないの。これが遅いからどうにかしたいって話か?
72:デフォルトの名無しさん
07/12/31 18:54:26
>>70は
>>65の件
73:デフォルトの名無しさん
07/12/31 20:01:07
俺の環境(athlon64 3000+,gcc4.1.2,linux2.6 x86)ではstlのを1とするとovenは10、>>70のは40ぐらいの時間だった
libstdc++でのuniqueの実装はadjacent_findで先頭部分で既にuniqueになってるものを飛ばし
あとはuniqueになっている部分の末尾と比較しながら
uniqueであるなら末尾の次にコピー、そうでないなら無視といった具合に
イテレータが進んでいくだけってシンプルなものだったから、それと比較したらまぁそんなもんかとはおもうけど
2.3秒かかるってのはstd::vectorのreserve()をせずにどんどん突っ込んだとかそういう要因の方がでかそう
74:デフォルトの名無しさん
08/01/01 18:56:28
p_stade(笑)
75:デフォルトの名無しさん
08/01/02 03:41:11
>>70
>解答が無かったんで、今自力でtemplate作ったけど、速度がでねぇ〜
for文の中でfindしてりゃそりゃ遅いだろうよw
ハッシュつかえば一発じゃん。
76:デフォルトの名無しさん
08/01/02 10:38:22
「ハッシュ」て、ハッシュドビーフのハッシュですか?
77:デフォルトの名無しさん
08/01/02 10:46:25
はい
78:デフォルトの名無しさん
08/01/02 12:04:26
ハッシュド、即ちハッシュキーに変換されたビーフ。
79:デフォルトの名無しさん
08/01/02 12:53:45
お前の話はつまらん
80:デフォルトの名無しさん
08/01/02 14:21:50
>>76
つまらん話のおかげでシチューを
火にかけっぱだったのを思い出した。
マジ感謝。
# 正月2日からレトルトってのもアレだが。
81:デフォルトの名無しさん
08/01/02 21:35:31
>>80
レトルトかよ!
時間とれる時くらいまともな料理しろって。(実は喰い物作るのって上手なスレッド処理みたいで面白いのだ)
82:デフォルトの名無しさん
08/01/02 23:21:32
>>81
分かるw
コンロが複数あると加熱で複数スレッドとか、火入れてる間に別の一品の下ごしらえとか。
慣れてくると俺OSがマルチスレッドに最適化されてくるのが分かる。
83:デフォルトの名無しさん
08/01/02 23:53:15
生活板か料理板か喪男板かダム河川板でやれ
84:デフォルトの名無しさん
08/01/03 03:33:58
ダム河川板とのつながりを理解できない俺は負け組み。
85:デフォルトの名無しさん
08/01/03 05:22:00
>>84がデッドロックしてるお…
86:デフォルトの名無しさん
08/01/03 08:54:14
定数を返すファンクタってありませんか?
って自分で書くのは簡単ですが,
標準があればそれを使おうと思います.
87:デフォルトの名無しさん
08/01/03 09:50:18
>>86
質問の意味がわかりません。
88:デフォルトの名無しさん
08/01/03 11:07:20
URLリンク(www.zvon.org)
的なやつのことだったら、自作しないと標準の範囲では存在しないはず。
それ以前にid関数もなかったはずだ。
boostは知らんので当該スレで聞いてくれ。
89:デフォルトの名無しさん
08/01/03 20:01:01
メイヤーズ先生の本を読んで、STLとマルチスレッドって相性悪いと言うか、
結局、期待通りの動作は、実装依存で全てのSTLの振舞いが保障されてないみたいなことが書いてあったな
STLを駆使した、マルチスレッドプログラミングって、かなり精通しないと難しそうな印象を持った
90:デフォルトの名無しさん
08/01/03 21:33:28
C++0x でスレッド関係のライブラリが標準で入るようになれば
改善されると期待してるんだけど,無理かなぁ.
91:デフォルトの名無しさん
08/01/03 22:09:54
>>89
その本ではどう動く事を期待してたの?
92:デフォルトの名無しさん
08/01/03 22:36:22
>>その本ではどう動く事を期待してたの?
Effective STL本に書いてあるのは
STLのコンテナでマルチスレッドをサポートする基準、ようするに、実装から
最大限望めることは
★複数の読み取りが安全である
★異なるコンテナへの複数の書き込みは安全である
以上で全てと書いてあるよ、ただし。「望むこと」はできるが、常に実現できるとは
限らないことに注意しなければなっらない。こうした内容を保障する実装もあり、保障しない実装もある。
とのことです、漏れ自身、STLを使ってない、マルチスレッドの実装をリファクタリング∩改造したことはあるけど、
STL∩マルチスレッドの経験ないからあんまり良く分かんないけど、なんか考えても難しそうな希ガスる。
93:デフォルトの名無しさん
08/01/03 22:40:27
>STLとマルチスレッドって相性悪いと言うか
うわさではよく聞くんだけどさ・・。具体的にこの場合に絶対におかしくなる
ってコードとどのSTL実装かを知ってる人っているのかな?
いまどきのLinuxとかWinでは問題ないとか勝手に思ってるんだけどさ。。
94:デフォルトの名無しさん
08/01/03 22:43:54
続き。以前にSolarisのSTLでクラス変数をがんばってpthread_lockで
囲ってる実装を見て、なんかあぶなそうだなあと思った記憶はある。
95:デフォルトの名無しさん
08/01/03 22:44:08
libstdc++については、"XXX MT"でgrep してみるといくつか既知のバグがあることがわかるよ。
文字列の参照カウントまわりとか。詳しくはbugzillaをどうぞ。
96:デフォルトの名無しさん
08/01/03 22:55:23
>>93
>>いまどきのLinuxとかWinでは問題ないとか勝手に思ってるんだけどさ。。
その本にも、同じようなことが書いてある
マルチスレッドプログラムの作成は難しく、STLの実装が最初から完全な
スレッドセーフであればと願うプログラマーは多いと
また、後先逆になったけど
>>具体的にこの場合に絶対におかしくなる
>>ってコードとどのSTL実装かを知ってる人っているのかな?
具体的なミューテックスを、行う際の完璧な(著者いわく)Lock方法が載ってるよ
97:デフォルトの名無しさん
08/01/03 22:59:59
後、STL以外のマルチスレッドの実装方法は難しいので、それに関しては
ビョーン本と、自分の書いた(メイヤーズ先生)MoreEffective C++を
読めとも書いてある
98:デフォルトの名無しさん
08/01/04 00:14:41
std::stringとかがCOWな実装ならロックしててもまずいよね場合があるよね。
99:デフォルトの名無しさん
08/01/04 00:16:52
そうだね。詳しくはMore Exceptional C++嫁という感じかな。
翻訳されてないけど。
100:デフォルトの名無しさん
08/01/06 20:55:32
>>86はどうなった?
101:デフォルトの名無しさん
08/01/06 21:10:40
日本語でおkとなった
102:デフォルトの名無しさん
08/01/06 22:58:34
これだから関数型言語のひとつも使えない連中は以下略
103:デフォルトの名無しさん
08/01/07 02:04:14
>>86>>100
Boost.Lambdaのconstantは望むものと違う?
104:デフォルトの名無しさん
08/01/10 23:19:46
a
105:デフォルトの名無しさん
08/01/11 13:33:47
b
106:デフォルトの名無しさん
08/01/11 14:01:47
初歩的な質問で申し訳ないのですが
class sample{
public:
vector<int> vector_int;
list<double> list_double;
〜省略〜
}
というようなクラスをnew演算子で動的に生成した場合、delete演算子で解放
する際にはメンバのvectorやlistのメモリも解放されるのでしょうか。
ご教授お願いします
107:デフォルトの名無しさん
08/01/11 14:11:45
>>106
される.
安心して使いたまえ.
108:デフォルトの名無しさん
08/01/11 14:18:33
>>107
ご教授ありがとうございます。
また質問で恐縮なのですが関連して、メンバを
vector<int> *p_vector_int
とし、コンストラクタ内で動的にメモリ確保したとすると、この場合はデストラクタ内
で解放するように定義しとかなければいけないのでしょうか?
109:別人
08/01/11 14:42:35
>>108
そのとおり、でも
sample a;
sample b = a;//もしくはsample b(a);
これでデストラクタが呼ばれると同じポインタを複数回deleteしたりする未定義動作になるから注意してね。
110:デフォルトの名無しさん
08/01/11 14:49:55
>>108
コンテナをnewするなんて糞みたいなことはやめたまえ。
111:デフォルトの名無しさん
08/01/11 15:00:28
>>109
>>110
ありがとうございます。
確かにコンテナをnewで確保するっていうのも変な話かも知れないです。
動的なメモリ確保・解放っていうのがintやdoubleといったような基本的な
型でしか情報が見つからなかったので、クラスや可変長配列の場合どうなるのか、
モヤモヤしていたんですが、すっきりしました。ありがどうございました。
112:デフォルトの名無しさん
08/01/11 15:05:27
>>108
解放忘れが気になるなら,
std::auto_ptr を使うといいよ.
113:デフォルトの名無しさん
08/01/11 15:06:50
>>112
調べてみます。ありがとうございます
114:デフォルトの名無しさん
08/01/11 15:08:25
auto_ptrなんて落とし穴満載の使いづらいのを進めるなよ。
115:デフォルトの名無しさん
08/01/11 15:10:54
>>114
そこらへんは、自分で判断しますので大丈夫ですよ・・・きっとw
116:デフォルトの名無しさん
08/01/11 15:19:07
>>108
boost::shared_ptr (or boost::scoped_ptr)
boost::shared_ptr<std::vector<int> > sp_vector_int;
117:デフォルトの名無しさん
08/01/11 15:24:57
>>111
動的確保する為のコンテナを、動的確保なんて「例」だとしても阿呆過ぎる。
118:デフォルトの名無しさん
08/01/11 15:30:23
大量に複数のコンテナを用意する場合、コンテナのメンバ変数に
メモリが圧迫されることがあるので、newするケースもあると思うがなぁ。
119:デフォルトの名無しさん
08/01/11 15:34:45
Container<Container<Type> >
120:デフォルトの名無しさん
08/01/11 15:49:21
>>114
だって,boost のビルドからしろって勧めるのも気が引けるじゃないか.
121:デフォルトの名無しさん
08/01/11 16:03:12
>>120
いや、なるべくbestの回答をするのが親切だと思う。
122:デフォルトの名無しさん
08/01/11 16:07:43
boost::shared_ptrはboostの他のライブラリに依存しない設計方針らしい
123:デフォルトの名無しさん
08/01/11 16:13:54
ビルドが必要なのは実装依存のコンポーネントだな。
thread関連とかasio(まだ無いが)とか。
shared_ptrなんぞバイナリー落としてインストールするだけだ。
124:デフォルトの名無しさん
08/01/11 17:24:46
>>123
それを言うならヘッダファイルジャマイカ?
125:デフォルトの名無しさん
08/01/11 18:09:22
C++相談室どこいった?
126:デフォルトの名無しさん
08/01/11 18:15:35
落ちた
127:デフォルトの名無しさん
08/01/11 18:23:18
996レスくらいだっけ? ぎりぎりで落ちたよね。
128:デフォルトの名無しさん
08/01/11 18:31:41
イテレータって何ですか?
129:デフォルトの名無しさん
08/01/11 19:03:45
>>124
ヘッダもだけどライブラリじゃなくてか?
130:デフォルトの名無しさん
08/01/11 19:06:44
shared_ptrはもう導入しないでどうするという感じだな
天才が作ってるうえアフォな質問にも丁寧に答えてくれるしな
boostの問題はライブラリによってサポートに差があることかな
131:デフォルトの名無しさん
08/01/11 19:18:34
>>130
次期 C++ で導入されるよ
132:デフォルトの名無しさん
08/01/11 20:05:28
TR1に入ってるものは全部C++0xで標準に入るんだよな。
shared_ptr weak_ptr bind function mem_fn type_traits...
133:デフォルトの名無しさん
08/01/11 20:09:01
regex とか random とか tuple とかも入るよ。
んで、auto_ptr は deprecated になる。
134:デフォルトの名無しさん
08/01/11 21:01:32
>>117
まぁ そうですね。clear()呼べば済む話ですもんね
お騒がせしました。
135:デフォルトの名無しさん
08/01/11 21:06:37
auto_ptr、deprecatedになるのかw
カワイソス
strstreamみたいな感じか
136:デフォルトの名無しさん
08/01/11 21:16:13
破壊的だと使い勝手悪いしなあ。
137:デフォルトの名無しさん
08/01/11 21:30:29
コンテナに入れられないのがよほど致命的なんだろ。
138:デフォルトの名無しさん
08/01/11 21:32:59
致命的過ぎるよなー、それ。
139:デフォルトの名無しさん
08/01/11 22:07:12
>>129
いやぁ,shared_ptr だけならヘッダファイルだけ
もってくればつかえるとオモタ.
140:デフォルトの名無しさん
08/01/11 22:08:03
で auto_ptr の直接の代わりは scoped_ptr ?
141:デフォルトの名無しさん
08/01/11 22:28:42
そんなもん使わずに shared_ptr 使えって事だ。
142:デフォルトの名無しさん
08/01/11 23:06:56
auto_ptrはreleaseできるのが地味に便利
143:デフォルトの名無しさん
08/01/11 23:09:13
参照カウンタのオーバーヘッドを気にしてしまう人もいるんじゃないか たぶん
144:デフォルトの名無しさん
08/01/11 23:16:19
boost::ptr_vectorは地味に便利だ
145:デフォルトの名無しさん
08/01/11 23:16:32
unique_ptrが楽しみ
146:デフォルトの名無しさん
08/01/11 23:24:31
参照カウンタ込みで new できるとオーバーヘッドも小さいんだが。
汎用的に作れないもんかね。
147:デフォルトの名無しさん
08/01/12 00:04:47
>>146
intrusive_ptrではだめなの?
148:デフォルトの名無しさん
08/01/12 00:13:08
>>147
使うために色々と必要な事があるからなあ。
149:デフォルトの名無しさん
08/01/13 20:04:36
multimapのいくつかの要素を述語を使って消去したいのですが
何か良い方法はありますか?
bool pred(pair<int, int> v)
{
return v.first == 3 && v.second == 'c';
}
int main(int argc, char* argv[])
{
multimap<int, char> m;
m.insert(make_pair(1,'a'));
m.insert(make_pair(2,'b'));
m.insert(make_pair(3,'c')); // 消去したい
m.insert(make_pair(3,'c')); // 消去したい
m.insert(make_pair(3,'d'));
m.insert(make_pair(4,'d'));
m.erase(???);
return 0;
}
環境はVC8です。
150:デフォルトの名無しさん
08/01/13 20:05:36
149です。
bool pred(pair<int, int> v)
のところは
bool pred(pair<int, char> v)
の間違いでした。
お願いします。
151:デフォルトの名無しさん
08/01/13 20:14:10
イテレータとfor_eachじゃね?
152:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/13 20:52:44
>>152
begin()とend()じゃなくて、lower_bound()とupper_bound()の方がいいと思う。
154:149
08/01/13 20:56:22
>>152
お示しの方法でうまくいきました。
>151,152
ありがとうございました。
155:デフォルトの名無しさん
08/01/13 21:39:07
>>152
折角mapなのに全検索は勿体無くねぇ?
156:149
08/01/13 21:47:11
>>153
lower_bound()とupper_bound()
にするのは速度的な問題でしょうか?
しかし、キーを二回余分に渡すのもちょっと面倒ですね。
>>152
一旦キーでマッチしたものを、すべてシーケンスコンテナに入れて
そこからさらに絞り込むっていう方法も考えていたんですが
今、私が書いているコードで使う要素数が多くても3個ほどなので
あまり変わらないような気がしました。
要素が多いとまた変わってくるかもしれません。
157:デフォルトの名無しさん
08/01/13 22:04:28
>>153 >>155
確かに。multimapだった。
equal_range()でイテレータの組を取ってもいいか。
>>156
全部の要素をlinerで舐めるのは非効率だわ。
上の人たちが言ってるやり方が効率が良い。
158:デフォルトの名無しさん
08/01/13 22:06:48
upper_boundとlower_boundは大小の順にソートシーケンスに
適用するアルゴリズムだ。
std::mapはデフォルトでキー順に既に要素を挿入した時点で
ソートされているのでまさに効率の良い方法。
Cで言うとbinary_search()な。
159:デフォルトの名無しさん
08/01/13 22:13:59
>>156
KeyとValueの両方の条件で削除要素を決定するなら
汎用性を考えた場合、Linerになるけど全部舐める
しかないかもな。まあ、今の場合は削除対象を絞る
条件がKeyが3に固定されてるからいいけど。
160:デフォルトの名無しさん
08/01/13 23:31:50
>>156
149の通りの条件なら、Key == 3 の範囲をequal_rangeで得て、
その範囲に対して Value == 'c' を消してまわるのが速そう。平均的には、ね。
総要素数に対してequal_rangeの範囲が無視できるだけ小さいならおk。
実際に行いたい条件が149と違う場合は話が違ってくる。
Keyが単一とは限らないとか。...って、>>159に書いてあるか。
161:デフォルトの名無しさん
08/01/14 10:47:18
そういえばmultimapってどういう用途に使ってますか?
mapは連想配列の様に便利に使ってますが
multimapという道具の使い方がいまいち思い浮かばない…。
162:デフォルトの名無しさん
08/01/14 11:02:35
得点が0〜100点で、名前を要素とする
同一得点は存在するからマルチ
163:161
08/01/14 11:07:45
>>162
なる。 70点取った人を羅列その他できますね。 サンクスです
164:デフォルトの名無しさん
08/01/14 11:23:23
>>161
辞書
165:デフォルトの名無しさん
08/01/14 11:25:39
STL限定なら別だけど辞書ならbimapの方がよくね?
166:デフォルトの名無しさん
08/01/14 11:48:17
用途の話しだ
167:デフォルトの名無しさん
08/01/14 13:18:36
「ようとのはなししだ」ですか?
168:デフォルトの名無しさん
08/01/14 13:19:33
>>167
辞書引け
169:デフォルトの名無しさん
08/01/14 13:19:40
とりあえず度数分布表以外にも例挙げてよよよ
170:デフォルトの名無しさん
08/01/14 13:21:26
>>168
辞書ならbimapの方がよくね?
171:デフォルトの名無しさん
08/01/14 13:22:53
用途の話だ。
172:デフォルトの名無しさん
08/01/14 16:46:33
>>162
この例で、0点のダメ男君が何人いるかと、
その名前の列記とかってどうやって出力するの?
mismatch()とか使うのかな。
foreachループでフラグ立てながらは勘弁
173:デフォルトの名無しさん
08/01/14 16:59:41
俺ならequal_range
174:デフォルトの名無しさん
08/01/15 02:04:41
割と典型的なequal_rangeの出番だと思う。
人数だけが知りたい場合は、countがいいかな。もちろんメンバ関数のほうね。
175:172
08/01/15 11:07:03
>>173-174
ありがとうございます。 equal_range、及びcount便利ですね。
説明読んでて、「該当者のいる得点一覧」(無重複の使用キー一覧)の方法に
ぶちあたった。 もうちょい調べてみます。
176:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/17 18:07:47
VC6やBCC5といった糞コンパイラを捨てる
178:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/17 18:13:54
ああそうだわ、>>178はBCCじゃコンパイルできないよ。
VC6はどうか知らんが、VC7.1やVC8、VC9なら行けると思う。
gcc3.4.5でもOKだった。
180:デフォルトの名無しさん
08/01/17 18:16:29
>>179
bcc5.5.1と5.8.2でコンパイルできたよ
181:デフォルトの名無しさん
08/01/17 18:17:41
BCC5.9.2でも行けるね。
182:176
08/01/17 18:25:31
>>178
ありがとうございます。>>180さんがおっしゃるとおり
bcc5.5.1ではOKでしたが、VC++6.0ではダメでした。
183:デフォルトの名無しさん
08/01/17 18:52:19
boost::begin()やboost::end()の実装を参考にしてみれば?
184:デフォルトの名無しさん
08/01/17 22:40:09
>>178がコンパイルできないのは、どこが原因?
185:デフォルトの名無しさん
08/01/17 22:44:49
>>184
iseq(T (&a)[n])
この部分が解析できないフロントエンドを持つコンパイラ。
186:デフォルトの名無しさん
08/01/17 23:06:23
VC6 とか無理だった記憶がある。
187:デフォルトの名無しさん
08/01/17 23:47:01
>>185
T (&a)[n] の仮引数aの型が解らんてこと?
aが配列参照と理解できないってことかな
188:デフォルトの名無しさん
08/01/17 23:59:29
配列参照に対応していないだけ。
189:デフォルトの名無しさん
08/01/18 00:54:28
BCCは template で T (&a)[n]とやってあると大丈夫みたいだが
int (&a)[n] のように型を決め打ちされてしまうとコンパイルが
通らなかったような。
templateの特殊化には対応してんのかな。どっかいろんな細かい
部分が標準と挙動が異なるのでSTLportから見捨てられかけたり
boostへの対応度が低かったりする。
190:デフォルトの名無しさん
08/01/18 08:37:20
コンパイラ実装者にとってパターンマッチほど面倒くさいものはない。
191:デフォルトの名無しさん
08/01/18 09:13:16
VC6 はもうそろそろ寝かせてやって,
VC9 使おうよ… Express Edition もあるんだから.
192:デフォルトの名無しさん
08/01/18 09:14:58
VC9も色々バグがあってヤヴァイみたいだけどな
STLをやboostを使うならVC8がgccとかも含めて一番安定して使えるかも
193:デフォルトの名無しさん
08/01/18 09:35:46
質問です。
equal_range()でvectorの特定の値を検索したいのですが
vectorの要素はマルチキーなのです。
typedef struct{
int x;
int y;
}DATA;
このような感じの場合。
どのようにすればいいのでしょうか?
やはり自分で作らないと出来ないのでしょうか?
宜しくお願いします。
194:193
08/01/18 10:30:48
事故解決しました。
第4引数があるんですね・・・。
でもこの引数、ググっても、日本語のページは、4件しかヒットしないや・・・orz
195:デフォルトの名無しさん
08/01/18 10:31:00
boost使うなら現状VC8の方がいいだろうが
それ以外バグが問題でVC8使った方がいい
ってあり得るの?
196:デフォルトの名無しさん
08/01/18 13:53:30
>>194
STLはそういう使い方しないもん。
structじゃなくて、classにしとけよ。
operator定義できないから、多分比較関数定義出来ないぞ。
検索する値はint型、比較する対象はvector<DATA>のDATAっしょ?
比較関数は定義できても、呼び出し側の引数は等価な型を与えるから無理。
先に比較用のoperator書かないと。
197:デフォルトの名無しさん
08/01/18 14:07:07
structかclassかの問題だったのか
198:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/18 14:30:05
× bool operator(const Data&, const Data&);
○ bool operator<(const Data&, const Data&);
200:デフォルトの名無しさん
08/01/18 14:46:28
>>198
operator<を定義してたらComparison(>>194の言う第4引数)渡さなくていいんじゃ?
201:デフォルトの名無しさん
08/01/18 15:12:36
あれ?structでoperator定義出来たんだ。
202:デフォルトの名無しさん
08/01/18 15:18:21
>>200
クラスのメンバーとして定義するなら、そうだね
>>201
structとclassの違いはデフォルトのアクセスレベルだけでしょ。
203:200
08/01/18 16:00:31
>>202
なるほど、>>198の言ってることがようやく解った
204:デフォルトの名無しさん
08/01/19 14:15:43
↓って同一?マングル名とかも含めて。
struct xxx {
xxx();
private:
int n;
};
class xxx {
int n;
public:
xxx();
}
205:デフォルトの名無しさん
08/01/19 14:40:30
class はテンプレート仮引数の型として使えるが、struct は使えない、という違いもなくはない。
206:デフォルトの名無しさん
08/01/19 14:44:14
>>205
お、ほんとだ。知らなかった。何か理由あるのかね。
207:デフォルトの名無しさん
08/01/19 14:48:53
typenameでいいじゃない
208:デフォルトの名無しさん
08/01/19 14:49:26
テンプレート仮引数のclassとクラス宣言のclassって意味が違うんじゃないの。
仮引数のclassは型名を表すだけで、そこにclass入れようがstruct入れようが組み込み型入れようが構わないんだから。
209:デフォルトの名無しさん
08/01/19 14:51:53
クラステンプレートを引数にとるときは class しか使えないね。
210:デフォルトの名無しさん
08/01/19 14:57:54
classを使わずにstructを使うメリットって何?
コンストラクタ定義しなくても、メモリサイズ的に変わったりするの?
211:デフォルトの名無しさん
08/01/19 14:59:21
簡単なデータの塊を表現する時に struct を使ってる。
struct Point3d { double x, y, z; }; とか。
212:デフォルトの名無しさん
08/01/19 15:01:34
構造を保ったままCとインタフェースできる。
213:デフォルトの名無しさん
08/01/19 15:11:54
template <template<typename T> class C> //OK
template <template<typename T> struct C> //NG
214:デフォルトの名無しさん
08/01/19 15:19:24
template <template<typename T> typename C> //NG
これも書いておかないと片手落ちだ
215:デフォルトの名無しさん
08/01/19 16:16:28
>>214
それは常識すぎる。
216:デフォルトの名無しさん
08/01/20 23:29:14
fwrite()でvector<int> vの中身を一気に書き出したいのですが
効率の良い方法はないのでしょうか?
vector<int> v;
fwrite(v, sizeof(int), v.size(), fp);
のような感じで一気に書き出せれば凄くうれしいのですが
これではエラーになります。定義されているoperatorがうまくintのポインタの代わりをしてくれるかと思ったのですが
どうやら無理のようです。
これは、一度個数分ループまわしてintに書き出さないとダメなのでしょうか?
217:デフォルトの名無しさん
08/01/20 23:33:38
&v[0]
218:デフォルトの名無しさん
08/01/20 23:39:03
あるいは &v.front()
好きな方を使え。
次期 C++ だと v.data() で良くなるみたいだが・・・
まだないものは仕方が無い
219:デフォルトの名無しさん
08/01/21 00:14:53
>>216
ofstream ofs;
と
copy(v.begin(), v.end(), ostream_iterator<int>(ofs, " "));
とかではダメなんか?
220:デフォルトの名無しさん
08/01/21 00:43:42
fwriteだからバイナリで書きたいんだろ
221:デフォルトの名無しさん
08/01/21 01:07:58
>>220
じゃあostreambuf_iterator使えば?
222:デフォルトの名無しさん
08/01/21 06:41:18
コンテナの中が連続して配置されていることが
保障されているのはvector だけ?
って,list とかでそんなことできるわけないよな.
223:デフォルトの名無しさん
08/01/21 06:55:51
vectorはC配列との互換性のためにわざわざそんな保証をしてるわけですから
224:デフォルトの名無しさん
08/01/21 08:23:25
そのために無駄なコピーが発生しまくり
225:デフォルトの名無しさん
08/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 ) );
このコードって超おせーんだけど、なんで??
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4805日前に更新/208 KB
担当:undef