【C++】STL(Standard Template Library)相談室 11at TECH
【C++】STL(Standard Template Library)相談室 11 - 暇つぶし2ch200:デフォルトの名無しさん
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