[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 04/24 09:38 / Filesize : 72 KB / Number-of Response : 302
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

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



1 名前:デフォルトの名無しさん [2009/01/11(日) 11:13:44 ]
C++標準ライブラリの一つ、STLについて。

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

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

136 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 22:33:29 ]
>>133
たしかに規格上は保証がないかもしれないが、なんだか屁理屈に聞こえる。

137 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 23:43:39 ]
>>136
同感だな
内部状態を持つ関数オブジェクトって普通にありえるからな
なんか現実を無視して重箱のすみを突いているって感じだな

138 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 23:53:59 ]
いや、これははまるぞ
移植してバグったとき、大変そうだ

139 名前:デフォルトの名無しさん [2009/02/24(火) 00:01:50 ]
ん?
マッサーの STL 本では generate のサンプルで内部状態を保持しているし
メイヤーズの Effective STL でも、関数オブジェクトの利点は
「必要に応じていくつでも状態を格納できること」と書いてるぞ?(たとえば p.161 )

述語は純粋関数でないとだめだけど。
サッターの C++ Coding Standardsでは
「述語は関数オブジェクトの部分集合である」( p.172 )としていて
すなわち述語でない関数オブジェクトは純粋関数でなくても良いということになってるぞ?

どっちなんだ。

140 名前:デフォルトの名無しさん [2009/02/24(火) 00:05:52 ]
ちなみに、generate の第三パラメータは述語ではないので、
(マッサー、メイヤーズ、サッターの本にあるとおり)
純粋関数でなくても良いということになる。

141 名前:デフォルトの名無しさん [2009/02/24(火) 00:12:15 ]
今、シルトの本も調べてみたが、やっぱり関数オブジェクトの利点として
「値を格納したり、追加機能を実装できる」( p.230 )と書いてるな。

142 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 00:12:48 ]
すまん、全部 age ちまった・・・ orz

143 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 00:44:58 ]
vectorの連続性と一緒だな
普通はコピーなんてしないし、規格作った方もそんなつもりじゃなかったけど
ちゃんと書いてないせいで信用できないし、コピーしちゃう実装を誰かが作っても責められない
そんな誰も得しない状態

0xで直るんかね

144 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 00:52:16 ]
vectorの格納領域は「必ず」連続するようになったのは1998年以降だから
まぁ、いまどきのコンパイラならもう必ず連続すると考えていいんじゃないの。




145 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 11:38:30 ]
std::vector<int> v;
v.reserve(10);
... // v に値を格納
std::copy(v.begin(),v.end(),std::ostream_itreator<int>(std::cout,","));

このコードの copy 内の ostream_iterator... の部分て何を行っているのですか?
コンテナの要素をループで書き出してるのは分かるのですが、内部でどのような処理をしているのでしょう?


146 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 12:43:55 ]
>>138
俺もはまった
boost::refして誤魔化した

147 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 12:53:46 ]
ええ、どこのベンダだよ

148 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 16:00:32 ]
vectorの格納領域と同じで、標準化委員会がどっかで修正コメントだしてないのかな?

149 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 16:14:34 ]
>>130
俺なら output_iterator を受け取る関数を作って back_inserter を渡す。
std::vector なら reserve してからね。

>>133
良くないのはそうだけど、総和とかには使うし、命名とかコーディングスタイルの話になるんじゃないか?

150 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 18:48:24 ]
>>146
それどこのSTLライブラリ?
で、どんなコードではまった?

151 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 20:48:17 ]
>>149
ライブラリの内部実装の話を命名やコーディングスタイルでどうするの?

152 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:49:33 ]
>>145
ttp://msdn.microsoft.com/ja-jp/library/0c6y7x31(VS.80).aspx


153 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:08:40 ]
>149
総和系なら accumulate があるべ。

154 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 08:55:19 ]
状態を持つと並行処理できないじゃないか。

なーんてね



155 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 09:03:23 ]
>>151
内部状態を持つ関数オブジェクトを使う話で、内部実装の話はしてないよ。
使わないほうがいいけど、使うなら注意を喚起するとか、専用の関数を作って封じ込めるとか、という話。

>>153
全くその通りでした。

156 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 19:52:40 ]
mapは構造体をキーに持つことができないのでしょうか?
具体的には、mapを使って2枚の画像の対応点を記録しようとしています。

typedef struct point
{
int x;
int y;
}point;

map<point, point> correspond;
point p1, p2;
/*p1とp2の座標を入力*/

correspond.insert( pair<point, point>(p1, p2) );

としてコンパイルするとerror C2784が出ます。
環境はVS2008、XP SP3を使っています。

どうしたら解決できるでしょうか?

157 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:04:06 ]
エラーの内容から二つのpointを比較できないコードであるということがわかるので、mapの為に比較関数を用意する。
方針としては、グローバルにpointの大小を判別するbool operator<(const point&, const point&)を定義するか、
correspondの宣言の歳にmap<point, point, compare_t> correspond(compare);とする
(ただしcompare_tは戻り値boolで引数に(const point&, const point&)を取ることができる関数オブジェクトまたは関数の型で
compareはそのインスタンス)

158 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:25:45 ]
>>157
素早い回答ありがとうございます。
pointのxとyどちらでソートすべきか比較関数を用意してやればよいということでしょうか?

159 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:32:21 ]
うん、例としては
bool f(const point& lhs, const point& rhs){
return lhs.x < rhs.x && lhs.y < rhs.y;
}
のようなものを定義して
map<point, point, bool(*)(const point&, const point&)> correspond(f);
かな?

operator<を使う方法についてはeffective C++とか参考にすれば、
綺麗に実装する方法が載ってると思う

160 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 20:39:54 ]
>>159
具体例までありがとうございます。
map 比較関数 でググったらいくつか例も出てきたので出来そうです。

よく考えるとmapは2分木を利用してるんだから自前の比較関数を用意してやる必要があるのは当たり前ですね。
勉強になりました。

161 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:33:14 ]
C++やSTLではコンテナの全要素を出力するときどのようにするのでしょうか?
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8944.txt
今は上のようにやってます。
list vector mapやDataのようなクラスが増えていくにつれコードが増え、似たような処理が何回も出てきそうです

162 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:37:20 ]
std::list<T>をTにすればコンテナ全種に使えるようになるはず。

163 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:41:47 ]
よくわからないけどこういうこと?
template<typename T>
std::ostream &print(std::ostream &ost, const T &cont)
{
ost << "[";
std::copy(cont.begin(), cont.end(), std::ostreambuf_iterator<T::value_type>(ost, ","));
ost << "]";
return ost;
}

164 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:50:54 ]
コンテナを取るんじゃなくて、algorithmみたいに範囲を取るようにすれ。

template<typename Iterator>
std::string to_str2(Iterator first, Iterator last) {
 std::ostringstream oss;
 Iterator it = first;
 oss << "[";
 if (it != last) {
  while (true) {
   oss << (*it);
   ++it;
   if (it == last)
    break;
   oss << ", ";
  }
 }
 oss << "]";
 return oss.str();
}




165 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 20:51:31 ]
まぁそれだけだとlist<list<...>>みたいなのに適応できないけどな

166 名前:161 mailto:sage [2009/02/27(金) 23:02:22 ]
>>162
ほんとですね、全部なおしました
std::ostream& operator<<(std::ostream & rhs, const <T>& lhs)はダメなんですね
当たり前なんでしょうけど

>>163
こういう書き方もできるのですね、、、
p to_str(dlist)かp 'to_str(std::list<Data, std::allocator<Data> > const&)' (dlist)でgdbから呼べるのですが、
ostreamかtemplate使うと消える?みたいなのでObject.to_string()とテンプレートではないto_str(x)は用意するので
ostreamやostringstreamを極力使わずにできればなと

>>164,165
Iteratorの中身がコンテナじゃなさそうな場所に使ってみます

167 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 00:04:03 ]
とりあえず、rhsは right hand side(右側)の略なんだから
lhs << rhs って形にしようぜw

168 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 12:55:03 ]
関数オブジェクトにしといてfor_each()じゃだめなのか

169 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 21:45:22 ]
>>168
それ、コードではどうやるの

170 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 01:25:00 ]
こんな感じ?

template <class T>
struct Out {
void operator()(T& i) const {
std::cout << i << ' ';
}
};

int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::list<int> aa(a, a + sizeof(a) / sizeof(a[0]));

std::for_each(aa.begin(), aa.end(), Out<int>());
}

171 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 12:40:27 ]
ostream_iteratorにassignという手も

172 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 16:04:02 ]
例としてよく引き合いに出されるのは ostream_iterator に copy だと思うが・・・

173 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 16:19:22 ]
for_eachを使うと copy よりも凝った出力形式を作れるってくらいかな

174 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 09:49:02 ]
#include <pstade/oven/io.hpp>
#include <pstade/oven/make_range.hpp>

int main()
{
namespace oven = pstade::oven;
std::list<int> l = a|oven::copied;
std::cout << (oven::make_range(l)) << "\n";
}



175 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 23:08:36 ]
>>136,143
www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#92
今のドラフトでは以下の記述が追加されている。
> algorithms that take function objects as arguments are permitted to copy those function objects freely

アルゴリズム内でどうコピーされるかは基本的に実装任せってことになるらしい。

for_each() の戻り値はまったく使えないことになりそうだ。

176 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 16:56:46 ]
>>175
for_eachの戻りはコピーされた関数オブジェクトに内部状態が反映されてるんじゃなかった?

177 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 18:17:17 ]
>176
関数オブジェクトに全要素を通して処理した結果の状態が保持されていることを期待するだろうが、
極端に言えば各要素の呼び出し毎に新しくコピーした関数オブジェクトを渡されたりすると、期待する
結果と異なる。
参照使うなりコピーされても大丈夫なようにはできるからまったく使えないは言い過ぎ。
とはいえ、そういう用途なら accumulate 使えばいいじゃん、とは思う。

178 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 18:22:46 ]
boost::ref使って渡せばいいんじゃないか。boost::mpl::for_eachではうまくいった

179 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 22:23:42 ]
 

180 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 19:02:38 ]
char *buf = new char[n];
//(snip)
std::istream is(pointer_streambuf(buf, buf_size));

みたいな感じで、ポインタをバインドできるstreambufってある?
ないならつくるんだけど。

181 名前:180 [2009/03/28(土) 19:11:47 ]
っていうか勢いあまって作ってしまったんだけど、標準かboostにあるならそっち使う。

あと、>>180の訂正:
x char *buf = new char[n];
o char *buf = new char[buf_size];



182 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 19:27:36 ]
istrstreamか?
廃止予定だけどw

183 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 20:12:25 ]
>>182
おk。でも廃止か。
strstreambufも廃止なんかな。

先にstringstream使ってて、basic_stringにしか対応してないから、
strstreamは無視してたわ。


184 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:15:50 ]
vectorについて、ある時点でのvectorの中身を参照するような配列のポインタ、
ちょうどstringのc_strのようなものはありますでしょうか。
allocatorのpointerやaddressがそうなのかと思ったのですが、

vector<int> v;
v.push_back(1);
v.push_back(2);
const int* p = v.get_allocator().const_pointer();
for(int i=0; i<v.size(); i++)
  cout << p[i];

のように書いても大丈夫でしょうか。



185 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:24:59 ]
いやいや、むしろ&v[0]とか&v.front()でいける。

アロケータのconst_pointerはT const*のtypedefだし、addressは&演算子と同じこと。
事実上、死に設定。

186 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:36:31 ]
どうしてイテレータじゃだめなのかすら?

187 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 20:48:40 ]
>>185
ありがとうございました。

>>186
C定義の関数に渡す必要があるためです。

188 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 20:49:58 ]
v.at(i)でええやん

189 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 20:53:17 ]
やりたかった例としてはこっちの方が良かったかもしれません。

int buf[256];
if(v.size()<256) memcpy(buf, &v[0], v.size());

190 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 14:51:17 ]
C++0xならv.data()が使えるんだけどな

191 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 06:40:05 ]
SGIがなんかあれなんですよね

192 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 10:09:49 ]
2度目のchap11

193 名前:インドリ [2009/04/09(木) 10:03:38 ]
blogs.wankuma.com/episteme/archive/2009/04/08/171040.aspx
d.hatena.ne.jp/faith_and_brave/20090408

194 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 11:21:23 ]
淫鳥



195 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:35:56 ]
久しぶりにSTLPort使おう思ったら、ビルドまでずいぶん便利になってるのな……

196 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:09:07 ]
STLport 5.2.1とboost 1.38.0を一緒に使おうと思ったらビルドエラーが出まくって無理だった

197 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 18:33:47 ]
ちょw

198 名前:デフォルトの名無しさん [2009/04/22(水) 21:47:20 ]
自分で作ったクラスにイテレータを実装する方法がいまいちわかりません。
どこかにいい解説はないでしょうか?

それとも皆 boost::iterator_facade を使ってるのかな?

199 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 23:50:36 ]
>>198
boost::iterator_facade で何か不満でも?

200 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 23:58:19 ]
boostはインストール禁止なんです…

201 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 00:07:33 ]
なんでSTLport5.2.1をMinGWでビルドしようとすると
"awk"が見つかりません のエラーが出るの?

STLport5.1.5までは何の問題もなくビルド出来ていたんだが

202 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 00:13:15 ]
>>200
じゃ、 boost::iterator_facade の実装を見るとか。

とりあえず作ってみたものと、その問題点をここで晒してみるといいかもしれない。

203 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 01:37:55 ]
>>198
std::iteratorのマニュアルを読んで、
std::istream_iteratorみたいな単純なやつを読む。

204 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 06:13:13 ]
インストールというか置くだけで使えるよ!

そういうことではないんだろうが



205 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 16:56:09 ]
lower_bound/upper_boundですが

ttp://www.wakhok.ac.jp/~sumi/stl/manual/bsearch.html#lower_bound()
> valueと一致する値を持つ最後の次の要素。見つからない場合はlast。
ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/algorithm.html#lower_bound
> ソートされたシーケンス[first,last)に対し、valueより大きいか等しい最初の要素の位置を返します。

書いてあることが違うのはどういう事なんでしょう?
手元の環境(VC2008EE)では後者のようですが・・・。

206 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 17:18:07 ]
>>205
その前者は、
>ある値と一致する範囲の一番最初を返す
と書いてある見出しとも矛盾している。

207 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 18:04:49 ]
後者が正しい。
もともと lower_bound と upper_bound は
value を挿入可能な半開区間 [ lower_bound, upper_bound ) を探すためのアルゴリズムだから。
これは equaLrange の結果に等しい。

って、マッサー本に書いてあった。確か。

208 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 18:22:49 ]
前者はlowerとupperの解説文章が逆ってことかな

209 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 18:27:28 ]
>>206
本当ですね。
>>207
なるほど。
>>208
逆としてみても、「見つからない場合はlast。」というのはおかしいですね。
あと、引数や戻り値のイテレータがランダムアクセスイテレータなのが気になります。

どうもありがとうございました。

210 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 05:52:59 ]
class A
{
private:
int m_nTime;
public:
A( int nTime ) : m_nTime( nTime ) {}
int GetTime() { return m_nTime; }
}

typedef map< int, A * > AMap;
typedef AMap::value_type AMapValue;

typedef list< AMap * > AMapList;

例えば上記の様な定義をしていて、
メイン関数内で、AMapList内をイテレータを利用して、特定のAMapの「Key」部を検索し、
見つかったら、AMapの「Value」部を出力(クラスAのGetTime()を呼び出す)するような処理
をさせたいのですが、どうすれば実現できるでしょうか?

また、listコンテナの中にmapコンテナを突っ込むような利用は、一般的にあまりされないの
でしょうか?


211 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 09:08:28 ]
>>210
それ、mapじゃなくてpairじゃいかんの?

212 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 10:43:41 ]
>>210
とりあえず自分で書いたやつを見せてみろよ。何がわからんのかわからん。

213 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 15:15:05 ]
>>210
1. AMapListから特定のAMapのイテレータを取得する。これをiとする
2. (*i->find(キー))->GetTime()

mapをlistに入れた構造が必要な場合はmapをlistに入れるよ
…としか答えられないな

214 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 15:28:56 ]
(*i)->find(キー)->second->GetTime();じゃね?



215 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 15:45:05 ]
>>214
そうだわ
スマネ

216 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 20:13:42 ]
vectorの要素ってCopy ConstructiveとAssignable以外には必要ないはずだよな?
VC9のSTLはDefault Constructiveを要求してきやがるんだが……。


#include <vector>

class hoge {
  hoge(int) {}
  hoge(const hoge&) {}
  hoge& operator=(const hoge&) { return *this; }
};

int main() {
  std::vector<hoge> vec;
  vec.resize(10);
}


217 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 20:30:07 ]
>>216
それ、 resize() のあとの要素が何で初期化されてることを期待してるの?

218 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 20:46:00 ]
ああ、ごめん書き間違えた
resizeの第二引数にhogeの適当なインスタンス渡してもだめなんだよ。

219 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 20:48:13 ]
g++つかえば

220 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:14:50 ]
>>216
bcc 6.1.0でも次のようなエラーが出るよ

エラー E2285 vector 608: 'hoge::hoge()' に一致するものが見つからない(関数 vector<hoge,allocator<hoge> >::resize(unsigned int) )
エラー E2247 vector 1179: 'hoge::hoge(const hoge &)' はアクセスできない(関数 vector<hoge,allocator<hoge> >::_Insert_n(_Vector_iterator<hoge,allocator<hoge> >,unsigned int,const hoge &) )
エラー E2247 vector 1203: 'hoge::hoge(const hoge &)' はアクセスできない(関数 vector<hoge,allocator<hoge> >::_Insert_n(_Vector_iterator<hoge,allocator<hoge> >,unsigned int,const hoge &) )
エラー E2247 xutility 1681: 'operator hoge::=(const hoge &)' はアクセスできない(関数 std::void fill<hoge *,hoge>(hoge *,hoge *,const hoge &) )
エラー E2247 xutility 1551: 'operator hoge::=(const hoge &)' はアクセスできない(関数 std::hoge * _Copy_backward_opt<hoge *,hoge *>(hoge *,hoge *,hoge *,_Nonscalar_ptr_iterator_tag) )
エラー E2247 xutility 1515: 'operator hoge::=(const hoge &)' はアクセスできない(関数 std::hoge * _Copy_opt<hoge *,hoge *>(hoge *,hoge *,hoge *,_Nonscalar_ptr_iterator_tag) )
エラー E2247 28: 'hoge::hoge(const hoge &)' はアクセスできない(関数 std::void _Construct<hoge,hoge>(hoge *,const hoge &) )
*** コンパイル中に 7 個のエラーが発生しました ***

221 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:18:44 ]
あら間違えて書き込んでしまった

ちなみにMinGW5.1.2(gcc3.4.5) + STLport5.1.7で同じソースをコンパイル
すると

vector1.cpp:11: error: no matching function for call to `hoge::hoge()'
vector1.cpp:5: note: candidates are: hoge::hoge(const hoge&)
vector1.cpp:4: note: hoge::hoge(int)

_algobase.h: In function `_OutputIter stlp_priv::__copy(_RandomAccessIter, _RandomAccessIter, _OutputIter, const stlp_std::random_access_iterator_tag&, _Distance*) [with _RandomAccessIter = hoge*, _OutputIter = hoge*, _Distance = ptrdiff_t]':
_algobase.h:250: instantiated from `_OutputIter stlp_priv::__copy_ptrs(_InputIter, _InputIter, _OutputIter, const stlp_std::__false_type&) [with _InputIter = hoge*, _OutputIter = hoge*]'

(...以降あまりにエラーが多いので省略)

で、やはりDefault Constructiveを要求してくるので、
Dinkumwareだけの問題ではない事がわかる。

222 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:24:02 ]
ちなみに

public:
hoge() {}

を入れると両者とも一発で通る。

223 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:28:54 ]
resizeのプロトタイプは
void resize(size_type sz, T c = T());
だからデフォルトコンストラクタがないと通らないこと自体は当然

224 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:50:24 ]
ただ実装はSTLPortもDinkumwareも
void resize(size_type, T)
void resize(size_type)
のように二つの関数に分けてるがな



225 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:55:27 ]
#include <vector>

struct hoge {
  hoge(int) {}
  hoge(const hoge&) {}
  hoge& operator=(const hoge&) { return *this; }
};

int main() {
  std::vector<hoge> vec;
  vec.resize(10, hoge(5));
  return 0;
}

これで
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
gcc version 4.3.2 20080827 (beta) 2 (GCC) ※ on cygwin
VC7.1 cl (Version 13.10.6030 for 80x86)
VC8 cl (Version 14.00.50727.762 for 80x86)
VC9 cl (Version 15.00.21022.08 for 80x86)
bcc 6.10
Comeau 4.3.9b + VC7.1
Comeau 4.3.9b + VC8
Comeau 4.3.9b + VC9
Comeau 4.3.9b + bcc 6.10
全部通るよ?

226 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:57:11 ]
>>223
>>218

227 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:57:50 ]
>>225
むしろそれだけの環境を使いこなすお前は何者

228 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 22:04:53 ]
俺の場合、<memory>218行目の
typename _Alloc::value_type _Val;
でもろにDefault Constructor要求された。

229 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 22:09:42 ]
>>216
privateじゃん

230 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 22:13:13 ]
こりゃひどい

231 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 22:22:48 ]
ワラタ

232 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 23:17:14 ]
ついでに言うとdefault constructibleだ。

233 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 01:05:59 ]
いいもの見させてもらった
記念パピコ(゚∀゚)

234 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 20:36:31 ]
あなたをprivateです。



235 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 21:58:18 ]
わたしはあなたのpublic

236 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 00:03:10 ]
ごめんなさい、ずっとfriendでお願いします

237 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 00:51:04 ]
delegateな俺の心はこっぱみじん

238 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 07:30:41 ]
>>237
スレ違い

239 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 10:48:21 ]
NULLぽ

240 名前:デフォルトの名無しさん [2009/05/04(月) 16:40:11 ]
      - -―- 、
    /...::::::::::::::.. ヽ
  / ..:::::::::::::::::::/\ ヽ
  /..:::/::::/::::// ヽ l:. l.
  l:::::!::::/●)  (●)|:: |
.  !:::l::::l///  ,, ///l:i:l  いやぁぁぁん
  ヽ:i::!、 r ― ァ ノノ'     
    ` l\`ー './
   ノヽ \_フ.ヽ
   |_ 丶   ヽ
.   | |' 初心者)



241 名前:デフォルトの名無しさん [2009/06/07(日) 14:44:09 ]
atnd.org/events/702

124.45.27.25:12086/stream.mp3.m3u
IRCNET #CRYBUTSU

242 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 15:06:24 ]
>>241
なぜここに?
0xスレに貼るのならともかく。

243 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:35:41 ]
ぶつぶつ会終わったよー

244 名前:デフォルトの名無しさん [2009/06/18(木) 11:57:11 ]
質問です
vector<int> v;
v.resize(100);
とやった際に、確保されたv[0]〜v[99]は、0クリアされていることは保障されているのでしょうか?

自分で試しにやってみる限り0クリアされているのですが、なぜわざわざクリアされているのか疑問です。
(mallocとかで確保したメモリは、クリアされていないですよね。なのになぜvectorだとわざわざそんなことを?)

自分で試した環境は、VS2008C++Express です



245 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 12:03:35 ]
>>244
新たに確保された要素はデフォルトコンストラクタで初期化される

246 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 12:04:28 ]
void resize( size_type sz, T c = T() ); だから。
なんで値で埋めるのかは…仕様決めた人に聞いてくれ。
領域確保だけならreserveがあるし。

247 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 13:00:56 ]
保障されてたんですね。
どうもありがとうございます

248 名前:2chとはいえマ的に mailto:sage [2009/06/18(木) 14:00:31 ]
×保障 (ある事態への)備え。プログラム的にいうとtry〜catch
○保証 約束されていること。プログラム的にいうとassert()を抜けるのが間違いない状態

249 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:37:51 ]
自作のクラスからヌルポの例外投げたいんだが
std::exceptionに標準であったりしない?
ヌルポ

250 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:47:35 ]
>>249
標準にはない。どういう場面で投げたい?
場合によっては標準の例外の方が意味が明確になるかもしれない。

251 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:54:58 ]
>>250
えっとね
データコンテナっぽいクラスを作ってて
->演算子とかで中のデータにアクセスさせてるんだけど
中のデータがnullの時は->演算子の処理中に例外で中断させたい

252 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 23:01:06 ]
>>251
なるほど。標準にマッチするのはなさそうかな。

253 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 23:04:08 ]
>>252
そっかthx

254 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 23:38:18 ]
boostになら何かそんなのあったな



255 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 23:44:06 ]
std::runtime_error でいいんじゃネ

256 名前:デフォルトの名無しさん [2009/06/29(月) 22:31:41 ]
vector で、バッファ拡張で要素をコピーするとき、メモリイメージをコピーではなく、
コピーコンストラクタでコピーして、コピー元は delete するのって何故だっけ?

257 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 22:34:09 ]
俺のLv7のESPで読んだところ
swap技法か例外安全について聞きたいらしい

258 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 00:43:34 ]
なんかいろんな話がごっちゃになってるような気がする

259 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 01:56:09 ]
>>256
メモリイメージをコピーで問題が発生しない保証は無いじゃないか

260 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 02:02:47 ]
>>256
仮にオブジェクトが自分のアドレスを使って何かしてるとしたら

261 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 07:47:16 ]
>>256
intなんかはメモリ領域のコピーでいいけど、
smart_ptrなどではオブジェクトのコピー処理を実行する必要があるから

262 名前:261 mailto:sage [2009/06/30(火) 07:50:46 ]
別にそうでもないか
忘れてくれ

263 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 18:34:47 ]
時々でいいので>>261の事を思いだしてあげて下さい

264 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:16:30 ]
>>262 >>256
smart_ptrはコピー時に参照回数を変更するひつようがあるんでメモリイメージコピーはできないからそうでもあるよ。





265 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:20:47 ]
メモリ領域コピーして元領域のメモリをそのまま解放したらカウント維持で問題ないからそうでもない
そういう問題ではない

266 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 17:15:45 ]
ものすごく基本的な質問をさせてください。
std::vectorで100個(数は可変)のデータがあって
これの最初20個ぐらい(数は可変)のデータを削除して
前に詰めたいのですが、どうすればいいのでしょうか?

erase (remove( ではダメでした。


267 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 17:29:47 ]
v.erase( v.begin(), v.begin() + 20 );

268 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 19:53:15 ]
できました!
ありがとうございました!


269 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 18:27:56 ]
初めて出てきた要素に対してのみ動作するunique_transformを実装してるのですが
unary_functionを継承した関数オブジェクトだけでなく
普通の関数も渡せるようにするにはどうすれば良いのでしょうか?

template<class InputIterator, class OutputIterator, class UnaryFunction>
InputIterator unique_transform(InputIterator first, InputIterator last,
OutputIterator result, UnaryFunction unary_func){
set<iterator_traits<InputIterator>::value_type> s;
while(first!=last){
if(count(s.begin(),s.end(),*first)>=1){++first;}
else{
s.insert(*first);
*result=unary_func(*first);
++first;++result;
}
}
return last;
}
struct i:public unary_function<int,int>{ int operator()(int a)const{return a;} };
//main側
string a="abcadbc";
string b;
unique_transform(a.begin(),a.end(),back_inserter(b),i());
cout << b << endl;
これを
int id(int n){return n;}を定義して
unique_transform(a.begin(),a.end(),back_inserter(b),id)
などと出来るようにしたい
後、STL実装ってVisualStudioのどっかのフォルダに入ってるんですかね?

270 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 18:51:41 ]
あ、特に修正しなくてもidも渡せるのか
>>269は忘れてください

271 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 18:53:25 ]
忘れました。^^

272 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 16:14:30 ]
std::vector<Object*> objs;
をソートしたいのですが、どうすればいいのでしょうか?
Objectクラスにはbool operator< (const Object& lhs, const Object& rhs); が定義されています。
objs.sort (objs.begin(), objs.end());
とやると、上の<を使わずにポインターの値そのものを使ってソートしてくれやがります。


273 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 16:48:57 ]
>>272
第三引数にコンパレータを渡せ

274 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 17:42:22 ]
Object& じゃ型が違うんじゃ
Object*& じゃないの



275 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 17:50:35 ]
>>274
ポインタ型同士の比較は272が言っているとおりコンパイラが組込で持っているから、
そんなのは定義できない。
というわけで>>273

276 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 18:00:58 ]
> コンパイラが組込で持っている

ああ、すっかり忘れてた

277 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 18:23:21 ]
bool operator <(Object* o1, Object* o2);

グローバル関数のオーバーロードで行けるかと思ったけど、
引数の片一方がクラスじゃねえぞ、とコンパイラにキレられた

278 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 18:54:19 ]
ObjectPtrクラスを作って、Objectの&を上書きしてPtrクラスを返すようにすれば

279 名前:272 mailto:sage [2009/07/29(水) 19:03:15 ]
みなさん、ありがとうございます。
言っていることがさっぱりわからないので、勉強し直してきます。


280 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 19:40:45 ]
うだうだ言っていないで、こう書けばいい。

#include <boost/lambda/lambda.hpp>
using boost::lambda::_1;
using boost::lambda::_2;

std::sort(objs.begin(), objs.end(), *_1 < *_2);


281 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 11:00:25 ]
lambda さんかっけーっす!

282 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 11:48:54 ]
なるほど、覚えておこう
std::sort(objs.begin(), objs.end(), *boost::lambda::_1 < *boost::lambda::_2);

283 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 21:19:29 ]
日本横断 STL の旅


SL の見間違いだった

284 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 22:07:16 ]
そういえばlsってよくslと打ち間違えて電車走るな
電車は飽きたので、slって打ったらSTLを宣伝するディストリを誰か作って



285 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 22:39:14 ]
>>284
走っているのは蒸気機関車であって電車ではない罠。
つーか、適当なSTL紹介文書を垂れ流すスクリプトを作って問題のslよりも上流に置けばいいだけじゃん。

286 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 22:47:12 ]
alias sl='lynx www.sgi.com/tech/stl/'

287 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 23:59:28 ]
ttp://d.hatena.ne.jp/wasisan/20090703/
STLってlistとtreeを区別するもんだっけ?

288 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 10:25:05 ]
>>287
別に区別するともしないとも言ってないんでないの?

289 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 18:32:11 ]
STLの中にはlistと別に_Treeクラスがある
listのノードは_Next, _Prevがあるだけだが
_Treeのノードは_Parent, _Left, _Rightがあるから
手が一本多い=構造に違いがある

っていうレスを求めてるのか?>>287

290 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 19:44:14 ]
標準で定められてるSTLコンテナはvector,deque,list,set,multiset,map,multimapだけ
treeはないし、あったとすればそれはベンダの独自拡張だから何とも言えない

291 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 02:49:21 ]
VCだと確かmapとsetの親がtreeだったな

292 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 00:36:35 ]
今時二分木とかw
ハッシュマップだろjk

293 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 01:20:43 ]
おまえのハッシュはソート済みにしてくれんのか

294 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 02:15:38 ]
おうよ、常にソート済みさ



295 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 02:25:42 ]
鬼才あらわる

296 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:04:35 ]
>>294
男前だなあんた

297 名前:デフォルトの名無しさん [2009/08/21(金) 12:08:50 ]
std::stringstreamは、ostringstreamとistringstreamの多重継承であると知った
std::stringはstd::stringstreamと関係してる?別物?

298 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 12:18:47 ]
>>297
当然関係してる。
で、当然別物。

299 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 12:34:25 ]
>>297
嘘乙
stringstreamはiostreamを継承している

300 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 21:02:08 ]
int a[10];
std::generate(a, a+10, rand);
で乱数を入れられますが、rand()%100を入れたい場合、bindとか使ってどう書けばいいですか?
lambdaならできそうな気はしますが。

301 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 22:33:27 ]
>>300
generate(a, a+10, bind(modulus<int>(), bind(rand), 100));
TR1(bind)無しだと関数オブジェクト作らないと無理かな。
bindが使える環境ならTR1のrandomを使った方が良いような気がする。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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