【C++】STL(Standard Template Library)相談室 11at TECH
【C++】STL(Standard Template Library)相談室 11 - 暇つぶし2ch100:デフォルトの名無しさん
09/02/04 21:42:37
bool なら deque 使うだろjk

101:デフォルトの名無しさん
09/02/05 02:15:21
deque<bool>とlist<bool>はコンテナだっけ

102:デフォルトの名無しさん
09/02/05 02:41:59
コンテナだよ

103:デフォルトの名無しさん
09/02/07 10:45:12
list<bool>・・・
使い道が思いつかないな

104:デフォルトの名無しさん
09/02/07 11:07:37
つbitset


105:デフォルトの名無しさん
09/02/11 15:26:30
vector<int>のインスタンスがa,b,cとあって、aとbの要素をつなぎ合わせたcを作るにはどう書くのが一番シンプルですか?
例えばaに1,2,3が、bに4,5,6が入っている時、cを1,2,3,4,5,6にしたいです。

106:デフォルトの名無しさん
09/02/11 15:33:22
c=a; c.insert(c.end(),b.begin(),b.end());

107:デフォルトの名無しさん
09/02/11 15:36:52
>>106
ありがとうございます。

108:デフォルトの名無しさん
09/02/11 15:38:18
intのvectorならこっちの方が速いし自然だよ
>>106は中身がクラスの場合用

size_t a_n = a.size();
size_t b_n = b.size();
std::vector<int> c(a_n+b_n);
memcpy(c.begin(),a.begin(),a_n);
memcpy(c.begin()+a_n,b.begin(),b_n);

109:デフォルトの名無しさん
09/02/11 15:48:05
>>108
なるほど、どうもです。

110:デフォルトの名無しさん
09/02/11 16:03:25
std::vector<int> v = (v1|pstade::oven::jointed(v2))|pstade::oven::copied;

111:デフォルトの名無しさん
09/02/11 16:04:12
>>108
memcpy使うのは最悪だろ

112:デフォルトの名無しさん
09/02/11 16:09:40
>>111
vector と PODの組み合わせなんだから別にいいだろ

113:デフォルトの名無しさん
09/02/11 16:20:27
ovenは相変わらず反則だな

114:デフォルトの名無しさん
09/02/11 16:26:51
わざわざ型安全性を捨ててメモリ不正アクセスの危険を冒してまでmemcpyを使う必要はなかろう
コピーするにしても std::copy を使うべき

よっぽど速度が遅くて困らない限りは >>106 で十分

115:デフォルトの名無しさん
09/02/11 16:33:50
>>108
さっそくバグってるなw
intが1byteの環境はあんまりないよね。

116:デフォルトの名無しさん
09/02/11 16:36:48
自分の場合こんな関数作ってユーティリティに突っ込んである
template<typename T, typename Range>
inline void range_extend(T &t, const Range &r)
{
t.insert(t.end(), boost::begin(r), boost::end(r));
}
// c = a; range_extend(c, b);

117:デフォルトの名無しさん
09/02/11 16:37:59
>>108
vectorのイテレータがポインタではないライブラリではコンパイルエラーだぞ
c.begin() は &c[0] に置き換えないとダメ

118:デフォルトの名無しさん
09/02/11 16:38:09
というか >>108 は memcpy にイテレータを直接渡してるじゃねーか
こんなん論外だ

119:デフォルトの名無しさん
09/02/11 16:43:56
!#include <iostream>
#include <vector>

#include <pstade/oven/jointed.hpp>
#include <pstade/oven/sugar.hpp>
#include <pstade/oven/copied.hpp>
#include <pstade/oven/io.hpp>
#include <pstade/oven/identities.hpp>
#include <pstade/oven/initial_values.hpp>

int main(int, char *[])
{
namespace ov = pstade::oven;
using namespace pstade::oven::sugar;
std::vector<int> a = ov::initial_values(1, 2, 3), b = ov::initial_values(4, 5, 6);

std::vector<int> v = (a >> b)|ov::copied;

std::cout << (v|ov::identities);
}

sugarで(問題部分だけは)さらに短くかけるらしいです

120:デフォルトの名無しさん
09/02/11 16:59:27
>よからぬ場所に出入りしていると、当てにならない人物に出くわし、 &v[ 0 ] の代わりに
>v.begin() を使うことができると言われるかもしれない。
(中略)
>率直に言えば、 &v[ 0 ] の代わりに v.begin() を使うよう勧めるような人たちと付き合っているなら、
>交友関係を考え直す必要がある。

スコット・メイヤーズ著 ピアソンエデュケーション刊
Effective STL~STLを効果的に使いこなす50の鉄則 p.73

121:デフォルトの名無しさん
09/02/11 19:03:40
そもそも >105 の質問は「一番シンプル」な方法を求めているんだから >106 が正解。

再確保によるロスを防ぎたかったら c.reserve(a.size() + b.size()) で準備してから
実行すればいい。 >108 の resize() では無駄な初期化( int の場合は 0 フィル)が入る。

要素型に依存する必要はまったく無い。

122:デフォルトの名無しさん
09/02/11 19:08:49
int の場合に memcpy() に最適化するというのも、ライブラリの実装やコンパイラが判別できる
範囲の話。

123:デフォルトの名無しさん
09/02/11 19:55:23
>>119

スレリンク(tech板:36番)

identitiesになにするもの?

URLリンク(p-stade.sourceforge.net)

URLリンク(www.codeproject.com)
の9.22を見る限りでは、そのままのRangeが返ってくるみたいだけど・・・



124:統合しました。。。:
09/02/14 18:06:57

スレリンク(tech板)

真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ

125:デフォルトの名無しさん
09/02/16 17:21:23
質問です。
STLはヘッダにその実装が書いてあるわけですが、
ということは「翻訳単位毎にコードが生成される」のでしょうか?

a,cpp
b.cpp
両方<vector>をincludeし、両方で vector<int> が使われていた場合、vector<int>のコードは2つ作られてしまうのでしょうか?
EXEファイルの容量がガンガン増えるような気がするのですが・・・

126:統合しました。。。
09/02/16 18:18:04
>>125

スレリンク(tech板)

真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ

127:デフォルトの名無しさん
09/02/16 21:54:46
>125
実装によるが、最終コードでは一つになっているのが普通。
C++ Templates The Complete Guide には 3 つのモデルが載ってる。概要は以下の通り。
1. Greedy Instantiation
翻訳単位ごとにインスタンス化するが、リンカで一つだけ残す。
2. Queried Instantiation
共有のデータベースを持ってそこに登録する。
3. Iterated Instantiation
リンク時に足りないものを検出してインスタンス化。

128:停止しました。。。
09/02/17 23:33:50
真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ

129:デフォルトの名無しさん
09/02/18 09:28:58
アヌスストッパーじゃないのか。

130:デフォルトの名無しさん
09/02/23 18:07:27
関数オブジェクトの使い方として、以下のような記述は許されますか?

// generate アルゴリズムを使ってコンテナに公差1の等差数列を代入する
template < class T > class Gens {
public:
  Gens() : s_( 0 ) {}
  Gens( T i ) : s_( i ) {}
  T operator () (){ return s_++; }
private:
  T s_;
};

int main() {
  vector< int > vector1( 20 );
  Gens< int > gens( 10 );                // 問題はココと
  generate( vector1.begin(), vector1.end(), gens ); // ココ
}

普通は
generate( vector1.begin(), vector1.end(), Gens< int >() );
のように書きますが、
あらかじめオブジェクトを構築しておいて、
そのオブジェクトを引数として渡すというものです。
上記の例ではあらかじめオブジェクトを構築することで
ジェネレータが作り出す数列の初項を10に設定しています。

131:デフォルトの名無しさん
09/02/23 20:10:05
>>130
全く問題ないよ

132:デフォルトの名無しさん
09/02/23 21:15:07
>>130
>上記の例ではあらかじめオブジェクトを構築することで
>ジェネレータが作り出す数列の初項を10に設定しています。
なら
generate( vector1.begin(), vector1.end(), Gens< int >( 10 ) );
でもインジャネーノ?


133:デフォルトの名無しさん
09/02/23 21:28:02
>>130
そもそも内部状態を持つ関数オブジェクトをアルゴリズムで使うのはよろしくない
URLリンク(www.kijineko.co.jp)

134:デフォルトの名無しさん
09/02/23 21:49:05
コピー禁止すりゃいいんじゃね?

135:デフォルトの名無しさん
09/02/23 22:29:12
誰にも突っ込んでもらえなかったけど、コピー禁止してどうやって渡すんだ orz

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

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

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

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

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

どっちなんだ。

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

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

142:デフォルトの名無しさん
09/02/24 00:12:48
すまん、全部 age ちまった・・・ orz

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

0xで直るんかね

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


145:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/24 12:43:55
>>138
俺もはまった
boost::refして誤魔化した

147:デフォルトの名無しさん
09/02/24 12:53:46
ええ、どこのベンダだよ

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

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

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

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

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

152:デフォルトの名無しさん
09/02/24 23:49:33
>>145
URLリンク(msdn.microsoft.com)(VS.80).aspx


153:デフォルトの名無しさん
09/02/25 00:08:40
>149
総和系なら accumulate があるべ。

154:デフォルトの名無しさん
09/02/25 08:55:19
状態を持つと並行処理できないじゃないか。

なーんてね

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

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

156:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/25 20:25:45
>>157
素早い回答ありがとうございます。
pointのxとyどちらでソートすべきか比較関数を用意してやればよいということでしょうか?

159:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/25 20:39:54
>>159
具体例までありがとうございます。
map 比較関数 でググったらいくつか例も出てきたので出来そうです。

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

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

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

163:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/27 20:51:31
まぁそれだけだとlist<list<...>>みたいなのに適応できないけどな

166:161
09/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:デフォルトの名無しさん
09/02/28 00:04:03
とりあえず、rhsは right hand side(右側)の略なんだから
lhs << rhs って形にしようぜw

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

169:デフォルトの名無しさん
09/03/03 21:45:22
>>168
それ、コードではどうやるの

170:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/04 12:40:27
ostream_iteratorにassignという手も

172:デフォルトの名無しさん
09/03/04 16:04:02
例としてよく引き合いに出されるのは ostream_iterator に copy だと思うが・・・

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

174:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/10 23:08:36
>>136,143
URLリンク(www.open-std.org)
今のドラフトでは以下の記述が追加されている。
> algorithms that take function objects as arguments are permitted to copy those function objects freely

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

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

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

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

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

179:デフォルトの名無しさん
09/03/18 22:23:42
 

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

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

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

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



182:デフォルトの名無しさん
09/03/28 19:27:36
istrstreamか?
廃止予定だけどw

183:デフォルトの名無しさん
09/03/28 20:12:25
>>182
おk。でも廃止か。
strstreambufも廃止なんかな。

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


184:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/31 19:24:59
いやいや、むしろ&v[0]とか&v.front()でいける。

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

186:デフォルトの名無しさん
09/03/31 19:36:31
どうしてイテレータじゃだめなのかすら?

187:デフォルトの名無しさん
09/03/31 20:48:40
>>185
ありがとうございました。

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

188:デフォルトの名無しさん
09/03/31 20:49:58
v.at(i)でええやん

189:デフォルトの名無しさん
09/03/31 20:53:17
やりたかった例としてはこっちの方が良かったかもしれません。

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

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

191:デフォルトの名無しさん
09/04/02 06:40:05
SGIがなんかあれなんですよね

192:デフォルトの名無しさん
09/04/02 10:09:49
2度目のchap11

193:インドリ
09/04/09 10:03:38
URLリンク(blogs.wankuma.com)
URLリンク(d.hatena.ne.jp)

194:デフォルトの名無しさん
09/04/09 11:21:23
淫鳥

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

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

197:デフォルトの名無しさん
09/04/10 18:33:47
ちょw

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

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

199:デフォルトの名無しさん
09/04/22 23:50:36
>>198
boost::iterator_facade で何か不満でも?

200:デフォルトの名無しさん
09/04/22 23:58:19
boostはインストール禁止なんです…

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

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

202:デフォルトの名無しさん
09/04/23 00:13:15
>>200
じゃ、 boost::iterator_facade の実装を見るとか。

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

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

204:デフォルトの名無しさん
09/04/23 06:13:13
インストールというか置くだけで使えるよ!

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

205:デフォルトの名無しさん
09/04/24 16:56:09
lower_bound/upper_boundですが

URLリンク(www.wakhok.ac.jp)()
> valueと一致する値を持つ最後の次の要素。見つからない場合はlast。
URLリンク(www005.upp.so-net.ne.jp)
> ソートされたシーケンス[first,last)に対し、valueより大きいか等しい最初の要素の位置を返します。

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

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

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

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

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

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

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

210:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/28 09:08:28
>>210
それ、mapじゃなくてpairじゃいかんの?

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

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

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

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

215:デフォルトの名無しさん
09/04/29 15:45:05
>>214
そうだわ
スマネ

216:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/29 20:30:07
>>216
それ、 resize() のあとの要素が何で初期化されてることを期待してるの?

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

219:デフォルトの名無しさん
09/04/29 20:48:13
g++つかえば

220:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/29 21:24:02
ちなみに

public:
hoge() {}

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

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

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

225:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/29 21:57:11
>>223
>>218

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

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

229:デフォルトの名無しさん
09/04/29 22:09:42
>>216
privateじゃん

230:デフォルトの名無しさん
09/04/29 22:13:13
こりゃひどい

231:デフォルトの名無しさん
09/04/29 22:22:48
ワラタ

232:デフォルトの名無しさん
09/04/29 23:17:14
ついでに言うとdefault constructibleだ。

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

234:デフォルトの名無しさん
09/04/30 20:36:31
あなたをprivateです。

235:デフォルトの名無しさん
09/04/30 21:58:18
わたしはあなたのpublic

236:デフォルトの名無しさん
09/05/01 00:03:10
ごめんなさい、ずっとfriendでお願いします

237:デフォルトの名無しさん
09/05/01 00:51:04
delegateな俺の心はこっぱみじん

238:デフォルトの名無しさん
09/05/01 07:30:41
>>237
スレ違い

239:デフォルトの名無しさん
09/05/01 10:48:21
NULLぽ

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



241:デフォルトの名無しさん
09/06/07 14:44:09
URLリンク(atnd.org)

URLリンク(124.45.27.25:12086)
IRCNET #CRYBUTSU

242:デフォルトの名無しさん
09/06/07 15:06:24
>>241
なぜここに?
0xスレに貼るのならともかく。

243:デフォルトの名無しさん
09/06/07 17:35:41
ぶつぶつ会終わったよー

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

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

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

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

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

247:デフォルトの名無しさん
09/06/18 13:00:56
保障されてたんですね。
どうもありがとうございます

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

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

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

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

252:デフォルトの名無しさん
09/06/28 23:01:06
>>251
なるほど。標準にマッチするのはなさそうかな。

253:デフォルトの名無しさん
09/06/28 23:04:08
>>252
そっかthx

254:デフォルトの名無しさん
09/06/28 23:38:18
boostになら何かそんなのあったな

255:デフォルトの名無しさん
09/06/28 23:44:06
std::runtime_error でいいんじゃネ

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

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

258:デフォルトの名無しさん
09/06/30 00:43:34
なんかいろんな話がごっちゃになってるような気がする

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

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

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

262:261
09/06/30 07:50:46
別にそうでもないか
忘れてくれ

263:デフォルトの名無しさん
09/07/02 18:34:47
時々でいいので>>261の事を思いだしてあげて下さい

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



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

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

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


267:デフォルトの名無しさん
09/07/17 17:29:47
v.erase( v.begin(), v.begin() + 20 );

268:デフォルトの名無しさん
09/07/17 19:53:15
できました!
ありがとうございました!


269:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/24 18:51:41
あ、特に修正しなくてもidも渡せるのか
>>269は忘れてください

271:デフォルトの名無しさん
09/07/24 18:53:25
忘れました。^^

272:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/29 16:48:57
>>272
第三引数にコンパレータを渡せ

274:デフォルトの名無しさん
09/07/29 17:42:22
Object& じゃ型が違うんじゃ
Object*& じゃないの

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

276:デフォルトの名無しさん
09/07/29 18:00:58
> コンパイラが組込で持っている

ああ、すっかり忘れてた

277:デフォルトの名無しさん
09/07/29 18:23:21
bool operator <(Object* o1, Object* o2);

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

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

279:272
09/07/29 19:03:15
みなさん、ありがとうございます。
言っていることがさっぱりわからないので、勉強し直してきます。


280:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/07/31 11:00:25
lambda さんかっけーっす!

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

283:デフォルトの名無しさん
09/08/01 21:19:29
日本横断 STL の旅


SL の見間違いだった

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

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

286:デフォルトの名無しさん
09/08/01 22:47:12
alias sl='lynx URLリンク(www.sgi.com)'

287:デフォルトの名無しさん
09/08/05 23:59:28
URLリンク(d.hatena.ne.jp)
STLってlistとtreeを区別するもんだっけ?

288:デフォルトの名無しさん
09/08/07 10:25:05
>>287
別に区別するともしないとも言ってないんでないの?

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

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

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

291:デフォルトの名無しさん
09/08/08 02:49:21
VCだと確かmapとsetの親がtreeだったな

292:デフォルトの名無しさん
09/08/21 00:36:35
今時二分木とかw
ハッシュマップだろjk

293:デフォルトの名無しさん
09/08/21 01:20:43
おまえのハッシュはソート済みにしてくれんのか

294:デフォルトの名無しさん
09/08/21 02:15:38
おうよ、常にソート済みさ

295:デフォルトの名無しさん
09/08/21 02:25:42
鬼才あらわる

296:デフォルトの名無しさん
09/08/21 11:04:35
>>294
男前だなあんた

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

298:デフォルトの名無しさん
09/08/21 12:18:47
>>297
当然関係してる。
で、当然別物。

299:デフォルトの名無しさん
09/08/21 12:34:25
>>297
嘘乙
stringstreamはiostreamを継承している

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

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


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch