トップページ⇒tech
950コメント288KB

【C++】Boost使い集まれ!

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C++の準標準ライブラリ"Boost"の専用スレです。
Download/Documentはこちらからどうぞ:
http://www.boost.org/

関連スレ
C++相談室 part11
http://pc3.2ch.net/test/read.cgi/tech/1032345774/

STLスレッド part2
http://pc3.2ch.net/test/read.cgi/tech/1026793823/
0232デフォルトの名無しさんNGNG
>>231
このスレに質問するのは著しく不適切です。

0233デフォルトの名無しさんNGNG
>>231
C/C++の宿題なら俺にやらせろ!
http://pc3.2ch.net/test/read.cgi/tech/1021862587/l50
0234233NGNG
宿題じゃなかった写し
0235デフォルトの名無しさんNGNG
すいません・・・他の板にカキコさせていただきますm(__)m
0236デフォルトの名無しさんNGNG
>>228
>>221じゃないけど、
例えばコンストラクタでnewしてデストラクタでdeleteするとき。
そのポインタをscoped_ptrでラップする。
vectorでもいいけど、オーバースペックかな?と思う時があるのと、
const auto_ptrよりも意味が明確に思えるんで。
0237デフォルトの名無しさんNGNG
>>228
俺が良く使うのは、pimpl イディオム使って実装を隠蔽するケース。
0238デフォルトの名無しさんNGNG
>>236-237
なるほど、それは確かに便利ですね。ありがとうございました。
0239デフォルトの名無しさんNGNG
scoped_ptr は所有権を移譲できないというところが潔くて好きだ。
その点、auto_ptr は中途半端。
0240デフォルトの名無しさんNGNG
>>230
boost::aryって int hoge[] = {1, 2, 3}; の模倣はできないんですかねえ?
固定長配列、私の用途だと要素数を明示したくないことがしばしば。
0241デフォルトの名無しさんNGNG
>>240
s/ary/array/;
anyと混ざった・・・鬱
0242デフォルトの名無しさんNGNG
質問れす。
next, priorに関連することなのですが、
なんでポインタ型のイテレータ(cont.begin()がT*を返す)
を直接インクリメント(デクリメント)する
のはダメなの?

typedef vector<int> cont_type;
cont_type cont;
...
for(cont_type::iterator it=++cont.begin() //bad!
  ; it!=cont.end()
  ; ++it)
{
...
}

文法的にも問題あるようには見えないんだけど...
なにか文法的に矛盾してしまうこととかあるの?
0243デフォルトの名無しさんNGNG
>>242
スレ違い。
0244デフォルトの名無しさんNGNG
>>244
一応next, priorに関連すると思うんだが…
0245デフォルトの名無しさんNGNG
>>242
右辺値と左辺値を勉強してきてくれ。
++ 演算子は右辺値にしか適用できない。
T* は左辺値。
右辺値を返す関数は型が T*&。
0246デフォルトの名無しさんNGNG
>>245
レスTHXです。
そっか。考えてみたら、
++246;
と一緒か。
結局スレ違いだった。スマソ...
0247デフォルトの名無しさんNGNG
>>245
左右が逆じゃありませんこと?
かくいうおれもよく間違えるんだが。
0248245NGNG
>>247
すまん、逝ってくる・・・。
0249デフォルトの名無しさんNGNG
boost::tupleのset_open()とかの使い方がよくわかりません。マニュアルを見て下のような
プログラムを書いてみたのですが・・・・・どういう時に使うとよいのでしょうか?

typedef boost::tuple<int, double, std::string> Btids;

Btids func()
{
return boost::make_tuple(1, 1.1, "abc");
}

int main()
{
Btids x;
x = func();
std::cout << boost::get<0>(x) << ' ' << boost::get<1>(x) << ' ' << boost::get<2>(x) << std::endl;
std::cout << boost::tuples::set_open('[') << boost::tuples::set_close(']') << boost::tuples::set_delimiter(',') << x;
}
0250デフォルトの名無しさんNGNG
どうして1が5つ出てしまうのでしょうか?

typedef boost::shared_ptr<int> Bsi;

bool ValueComp(const Bsi& bs1, const Bsi& bs2){
return *bs1 < *bs2;
}

int main()
{
std::vector<Bsi> vsi;

vsi.push_back(Bsi(new int(1)));
vsi.push_back(Bsi(new int(4)));
vsi.push_back(Bsi(new int(3)));
vsi.push_back(Bsi(new int(5)));
vsi.push_back(Bsi(new int(2)));

std::sort(vsi.begin(), vsi.end(), ValueComp);

std::vector<Bsi>::const_iterator pos = vsi.begin();

while (pos != vsi.end())
std::cout << *pos++ << std::endl;
}
0251デフォルトの名無しさんNGNG
250です。

*pos++を**pos++としたら数字は表示されました。
しかしまだソートがうまく行きません。
0252デフォルトの名無しさんNGNG
・・・・・と思ったらstd::sortをコメントアウトしていました。スマソ。
boost::shared_ptrはstd::auto_ptrと違い、コンテナに入れてソートしても
いいんですよね。
0253デフォルトの名無しさんNGNG
>>251
VC6SP5 でうまく行っておりまする・・・。
0254デフォルトの名無しさんNGNG
>>253
ありがとうございます。

ついでなのですが、ValueCompを次のような叙述関数で書くべきなのでしょ
うか?これはboostの質問ではないですね。

struct ValueComp : public std::binary_function<const Bsi&, const Bsi&, bool> {
bool operator()(const Bsi& bs1, const Bsi& bs2) {
return *bs1 < *bs2;
}
}
0255デフォルトの名無しさんNGNG
>>254
メシ食ってたYO!!!

関数オブジェクトを用いる一番の利点は、コンパイラに処理をインライン展開
させる事らしい。
250 の書き方だと関数ポインタが発生するから、インライン展開できなくなる。
not2() とかも使えないし。
それでもいいなら好きなように。
0256デフォルトの名無しさんNGNG
>>255
ありがとうございます!!手間を惜しまず関数オブジェクトにします!
0257デフォルトの名無しさんNGNG
>>245
>++ 演算子は右辺値にしか適用できない。
適用すると右辺値になる、が正解じゃないの?
0258デフォルトの名無しさんNGNG
boost::lambda使っておられる方いらっしゃいますか?
0259デフォルトの名無しさんNGNG
つーかboost::lambdaって何に使うの?
あの辺の構文てオナニーにしか見えないんだが。
開発者のジョークだろ。
0260デフォルトの名無しさんNGNG
lokiの方がオナーニだろ。
0261デフォルトの名無しさんNGNG
boost::smart_ptrのvector vのソートの時とか
std::sort(v.begin(),v.end(),*_1 < *_2);
と書くほうが 関数オブジェクト用意するより見やすくない??
ifだとか色々使うのはもう潔く関数オブジェクトにしたほうがいいとは思うけど
0262デフォルトの名無しさんNGNG
compose系のほうがオナーニに感じるなぁ。
意地でもワンライナーな皆さんを応援しちゃうぞ、みたいな。

# 好んで使いますが(w

0263デフォルトの名無しさんNGNG
lambda使うと、bind2ndとか難解な構文を使わなくても仮引数で表現
できる所がうれしい。

難を言えば、gccぐらいでしか動かない事かな。

composeってcompose_f_gx_hyとか?あれは欲しいよ。二つの文字列
をある基準で比較する時なんかにstd::lexicographical_compareと
組み合わせてよく使っている。
0264デフォルトの名無しさんNGNG
>>263
composeの奴、書いてみてー。
0265デフォルトの名無しさんNGNG
>>264
STLスレッドからの転載だけど、例えばstringを大小文字区別しないで辞書順に
挿入したりソートしたりする時とか。

struct StrCmpi {
bool operator() (const std::string& s1, const std::string& s2) const {
return std::lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(),
boost::compose_f_gx_hy(std::less<char>(), std::ptr_fun(std::toupper), std::ptr_fun(std::toupper)));
}
};

int main()
{
typedef std::map<std::string, size_t, StrCmpi> Ssize;
Ssize mp;

mp.insert(std::make_pair("test1", 123));
mp.insert(std::make_pair("Test2", 456));

Ssize::const_iterator pos;
for (pos = mp.begin(); pos != mp.end(); ++pos)
std::cout << "string = " << pos->first << ", size_t = " << pos->second << std::endl;
}
0266デフォルトの名無しさんNGNG
あっこれ関数オブジェクトにして使ってください。
0267デフォルトの名無しさんNGNG
こんな感じで。

struct StrCmpi : public std::binary_function<const std::string&, const std::string&, bool> {
bool operator() (const std::string& s1, const std::string& s2) const {
return std::lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(),
boost::compose_f_gx_hy(std::less<char>(), std::ptr_fun(std::toupper), std::ptr_fun(std::toupper)));
}
};
0268デフォルトの名無しさんNGNG
ptr_fun はイマイチだなぁ。inline化されるような方法はないだろうか。
0269デフォルトの名無しさんNGNG
>>268
ptr_fun使わないで、関数オブジェクトを呼び出すようにすれば
いいじゃん。その代わり既存のライブラリは使えなくなるが。
0270デフォルトの名無しさんNGNG
Kylixが最近C++対応したみたいだけど、コンパイラってg++なんだっけ? bccもどきなんだっけ?
後者だったりする場合、boostって使えてますか? 使ってる人感想きぼうん
0271デフォルトの名無しさんNGNG
ボロボロかも>>270
http://216.239.33.100/search?q=cache:hOeO5TxQ0e8C:boost.sourceforge.net/regression-logs/cs-linux.html+Kylix+boost+bind&hl=ja&ie=UTF-8
0272デフォルトの名無しさんNGNG
GCCでええやん。
0273デフォルトの名無しさんNGNG
>>270
BCCはboost::lambda、boost::format、boost::array、boost::multi_array以外は
だいたい通るよ。kylixが糞なのだと思う。
0274デフォルトの名無しさんNGNG
>>271
今 C++ コンパイラ作り直してるから、それが出て完成度が高まるまで
待つしか。
0275デフォルトの名無しさんNGNG
から揚げ
0276デフォルトの名無しさんNGNG
商用のプロジェクトでboost使ってライセンス的に問題が生じた経験の
ある人いる?
0277デフォルトの名無しさんNGNG
>>276
boost使っても、コードの中に"boost"とかいう文字列でも入らなければ、
使った事はまずわからないような気もするが。

テンプレートライブラリはそういう点ズルができそう。
0278276NGNG
だめぽ>>277

$ g++ hoge.cpp
$ nm a.out |grep boost
080493fc W _ZN5boost12lexical_castISsiEET_T0_
0804a3ea W _ZN5boost16bad_lexical_castC1ERKS0_
0804a3ca W _ZN5boost16bad_lexical_castC1Ev
0804a488 W _ZN5boost16bad_lexical_castD0Ev
0804a40c W _ZN5boost16bad_lexical_castD1Ev
0804a4c2 W _ZNK5boost16bad_lexical_cast4whatEv
0804b00c V _ZTIN5boost16bad_lexical_castE
0804a548 V _ZTSN5boost16bad_lexical_castE
0804b018 V _ZTVN5boost16bad_lexical_castE
$ strings a.out |grep boost
N5boost16bad_lexical_castE
$ strip a.out
$ strings a.out |grep boost
N5boost16bad_lexical_castE
0279276NGNG
>>277
それに、ライセンスは守るっていう前提でヨロスコ・・
0280デフォルトの名無しさんNGNG
VC++のReleaseBuildでもやはり若干形跡が残るなぁ。

.?AVbad_any_cast@boost@@
boost::bad_any_cast: failed conversion using boost::any_cast
.?AVuse_count_is_zero@boost@@
0281デフォルトの名無しさんNGNG
Type_info::name
だよね。きっと。
0282デフォルトの名無しさんNGNG
長文すまそ。
たとえば regex.hpp には次のような条がある。
/*
*
* Copyright (c) 1998-2002
* Dr John Maddock
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Dr John Maddock makes no representations
* about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*
*/
ということで、バイナリには "Copyright (c) 1998-2002 Dr John Maddock"
を埋め込んで、ドキュメントには上の条文全文を記しておけばよいらしい。
でも不安なのは、"this software" というのが何を指すかだ。こちらが作った
プロダクト全体を指す、とか解釈されたらたまらんw
0283続きNGNG
また、scoped_ptr.hpp では、
// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
// Copyright (c) 2001, 2002 Peter Dimov
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
// See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation.
//
となっている。こちらは copyright notice だけでよいらしい。
でも、"the above copyright notice" じゃなくて、"this copyright notice"
になっているところが不安。まさか条文全体のことを指してるとかw
0284デフォルトの名無しさんNGNG
ナルホド。じゃぁ、

[copyright.h]

namespace {
const char* regex_hpp = "Copyright (c) 1998-2002 Dr John Maddock";
const char* scoped_ptr_hpp = "(C) Copyright Greg Colvin and Beman Dawes 1998, 1999."
"Copyright (c) 2001, 2002 Peter Dimov";
}

とでもしておいて、boostをincludeするときにコイツも一緒にincludeすればいいかな。
ありがとう。
0285デフォルトの名無しさんNGNG
http://www.boost.org/more/lib_guide.htm#License

基本的にMITとか変形BSD的なライセンスだから、そんなに気にせんでいいと思うが。
・ソースを公開するときにはboostのライセンス表記をそのまま残す
・ドキュメントにはCopyRight表記を残す
で。
0286デフォルトの名無しさんNGNG
結構面倒だね
0287デフォルトの名無しさんNGNG
>>284 みたいに、バイナリに文字列を埋め込まないと駄目なの?
コメントじゃいかんの?

0288デフォルトの名無しさんNGNG
Must not require that the license appear with executables or other binary uses of the library.
0289デフォルトの名無しさんNGNG
さんきゅす
0290デフォルトの名無しさんNGNG
ここでいう "license" には copyright notice も含まれるんか?
0291デフォルトの名無しさんNGNG
・ソースを公開するときにはboostのライセンス表記をそのまま残す
といわれても、普通は#includeするだけだから残すもなにもないとおもうんだけども。。
0292288NGNG
>>290
俺も貼ってからそれ疑問に思った。
0293デフォルトの名無しさんNGNG
>>291
ライブラリ部分を改変した場合の話なんじゃ?
0294デフォルトの名無しさんNGNG
>>293
なる舗道
0295デフォルトの名無しさんNGNG
まとめると…

・バイナリへの埋め込みは推奨(義務ではない)。
・作成したプログラム等に付属するドキュメント等には
明記する必要はなし。
・ライブラリを改変等した場合に©表記の必要が
でてくる。

であってる?
0296デフォルトの名無しさんNGNG
・バイナリへの埋め込みは義務ではない。
・作成したプログラム等に付属するドキュメント等にはライブラリ冒頭の
ライセンス条項をそのまま転記する必要がある(*)。
・ライブラリを改変等した場合に元のライブラリ冒頭の?表記を削除
してはいかん。


(*)必要ないライブラリもある(scoped_ptr他)

だと思われ。
0297デフォルトの名無しさんNGNG
>>296
s/?表記/copyright表記/

化けてしまったよ。
0298デフォルトの名無しさんNGNG
組み込みでEmbedded-C++ではない、普通のC++を使えているラッキーな人で、
boostも使っている人っています?boost使うことを密かに画策中なんですが。
0299デフォルトの名無しさんNGNG
boostを使う理由って、単に使ってみたいってだけだろ。
0300デフォルトの名無しさんNGNG
>>299
おいおい
0301デフォルトの名無しさんNGNG
>>299
僻むほど難しくないから使ってごらん。
ほんとに。
0302デフォルトの名無しさんNGNG
>>301
簡単ですがそれが何か?
0303298NGNG
煽る屑は放置するとして、298にお答え希望〜
0304デフォルトの名無しさんNGNG
boostを使う理由がないので使っていません。
0305298NGNG
>>304
僕は便利だと思っているのですが、それはどうやら間違った考えだったので304=299さんのように
boostなどはきっぱりと使うのをやめ、まっとうなコーディングに戻ります。
お導きありがとうございました。

...とでも言って欲しいんでしょうか?意図を量りかねる。
0306デフォルトの名無しさんNGNG
>>305
> 意図を量りかねる。
それは馬鹿だから。
0307299NGNG
perl最強!!
perl >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> boost
0308デフォルトの名無しさんNGNG
>>307
perl厨のせいにしようとしてるよ。
必死だな。よっぽど悔しかったと思われる。
0309デフォルトの名無しさんNGNG
STLスレの887の実装って、var型に依存しない形にするにはどうしたらいいんでしょうか?
いろいろ試しているんだけどよくわからない・・だれかhelp.

typedef boost::indirect_iterator_pair_generator<
std::vector<var*>::iterator, // 元になるイテレータ(or ポインタ)
var // operator*(operator*())が返す修飾なしの型
// ここにconstと非constについての参照型やポインタ型が並ぶが省略可
> iterator_gen; // とりあえず命名

std::vector<var*> var_list;
iterator_gen::iterator i(var_list.begin());
iterator_gen::const_iterator j(var_list.begin());
0310デフォルトの名無しさんNGNG
皆さんにお伺いしたいのですが boost の利点と欠点を教えてもらえないでしょうか?
面白かつ便利そうなので使ってみようと思うのですが,いまいち情報が少なくて...
コーディングしたときの速度なんかについても教えてほしいです.
やはり,便利と速度は両立しないのでしょうか?ここが特に気になります.
0311デフォルトの名無しさんNGNG
>>310
bind, iterator_adaptors あたりは、最適化(inline化)しないと遅いかもしれない。
でも、最適化かければぐちゃぐちゃにinline化されてなかったことになる(言い過ぎ)
のであまり気にしてない。

そもそも、boostと一口にいわないで、boostのどれ、と言わないと答えにくいと思われ。
0312デフォルトの名無しさんNGNG
>>311
どうinline化されるのか見たいんだけど、asm出力見る以外の方法ないかな?
http://public.kitware.com/GCC_XML/HTML/Index.html を使うのはどうかと
妄想しているんだけど使ったことあるひといません?

0313デフォルトの名無しさんNGNG
Macintosh版CodeWarrior8でBoost使ってる方いますか?
regex++を使いたいと思って入れてみたんですが,
CodeWarrior5用のプロジェクトファイルは発見できたものの,
8では読み込めずどうしたものかと。。。

regex++の場合は単に,hppをincludeすればいいというわけにはいかないんですよね?
0314デフォルトの名無しさんNGNG
>>309
template<typename A> struct iterator_gen :
  boost::indirect_iterator_pair_generator<
    std::vector<A*>::iterator,
    A
  > {};

あと適当にHelper関数作ったほうが便利だと思うけど、
std::iterator_traitsとかboost::type_traits の詳細を忘れた。。。
0315デフォルトの名無しさんNGNG
教えていただきたいことがあります
vc60にて、"boost/lambda/lambda.hpp" をインクルードしただけで
"fatal error C1001: 内部コンパイラ エラー" というエラーが発生してコンパイルができません。
回避方法をご存知の方がいらっしゃったら教えてください。よろしくお願いします。
0316デフォルトの名無しさんNGNG
>>315
http://www.boost.org/status/cs-win32.html
無理そう。。。。
0317デフォルトの名無しさんNGNG
AnSi C++対応を目指すことすらしないコンパイラに何かを期待しても

無   駄   で   す
0318rubyist@カラアゲうまうまNGNG
ぶぁか
0319デフォルトの名無しさんNGNG
http://www.zdnet.co.jp/news/0211/09/nebt_08.html
「2003年初頭リリースのMicrosoft C++コンパイラ新版では
ISO C++標準に対して98%近い準拠になる」

残り2%の非対応部分にboostが引っ掛かってしまう悪寒
0320デフォルトの名無しさんNGNG
そのページにあるリンクにこんな記事が。。。’
http://www.zdnet.co.jp/news/0211/09/nebt_03.html

こんな肩書きの仕事があるんだねえ。
0321デフォルトの名無しさんNGNG
ちなみに98パーセントまで対応したというのなら、
そこりの2パーセントがなんなのかを列挙して欲しいところですな。
0322デフォルトの名無しさんNGNG
確か、templateのexportには対応せんとどこかで言ってた気がした。
0323デフォルトの名無しさんNGNG
今、http://www.boost.org/libs/smart_ptr/shared_ptr.htm を
読んでるんだが、ここに出てくる "intrusive counting" とか
"intrusive-counted smart pointer" の意味がよく分かりません。
誰か教えてくだされ。
0324デフォルトの名無しさんNGNG
>>323
http://www.kmonos.net/alang/boost/classes/intrusive_ptr.html
でも読むべし。
0325デフォルトの名無しさんNGNG
なるほど。サンクス。
つまり、参照カウントであれリンクリストであれ、管理される対象としての
オブジェクトの中身をいじるようなのがintrusive (侵入的) と呼ばれるわけだね。
0326デフォルトの名無しさんNGNG
どなたかdate-timeライブラリ使われた方いらっしゃいます?
0327デフォルトの名無しさんNGNG
exportサポートしてる処理系なんてほとんどないだろ。二つ、三つくらいか?
0328デフォルトの名無しさんNGNG
>>327
存在することの方が驚きだ(ぉぃ 具体的に、どのあたりの処理系が
サポートしてるんでしょう? ちょっとドキュメント読んでみたいぞ。
0329デフォルトの名無しさんNGNG
Comeau C++ はサポートしてるらしいね。漏れは他はしらないや。
0330デフォルトの名無しさんNGNG
VC60 にて Lambda が使えないことについての件、了解しました。
どうもありがとうございました。
0331デフォルトの名無しさんNGNG
Lambda をランバダと呼んでしまうのはダメですか?
■ このスレッドは過去ログ倉庫に格納されています