ブーストの最もよく使われる部品[終了]


115

発見したとき、boost::lexical_cast「なぜこれをもっと早く知らなかったのだろう」と思いました。-私は次のようなコードを書かなければならないのが嫌だった

stringstream ss;
ss << anIntVal;
mystring = ss.str();

今私は書く

mystring = boost::lexical_cast<string>(anIntVal);

昨日、stackoverflowでブーストスプリットに遭遇しました(コードを書く手間を省く別の宝石)。

string stringtobesplit = "AA/BB-CC")
vector<string> tokens;

boost::split(tokens, stringtobesplit, boost::is_any_of("/-")); 
// tokens now holds 3 items: AA BB CC

定期的に使用できる他の機能を探すために、Boostのドキュメントを調べ始めますが、見落としが非常に簡単になると思います。

どのブースト機能を最もよく使用していますか?


1
興味深いことに、Boostを使用する前に独自の「数値を文字列に変換する」関数を作成するのをやめた理由は何ですか。重複を見てシンプルなテンプレートを作成し、それを使用した後、多分、見つけたときにブーストバージョンに切り替えました...
Len Holgate、2009年

4
こんにちはレン、さまざまなプロジェクトでさまざまなタイミングでテンプレート化された「ToStr」関数を作成しましたが、他のプロジェクトに移り、3ライナーを作成することになりました。 )「misc_funcs」ファイル作成のオーバーヘッドとは対照的に
hamishmcn

回答:


62

おそらく、私のブーストで最も使用される部分はboost :: shared_ptrです。


13
また、おそらく最も頻繁に使用されます。私は、参照、ポインタコンテナ、auto_ptrによるshared_ptrの使用のほとんどをリファクタリングしなければならないという困難な方法でレッスンを学びました。:私は今、ほとんどがこれに同意しbureau14.fr/blogea/index.php/2009/08/...
アミット

1
@phaedrus:リンク更新:blogea.bureau14.fr/index.php/2009/08/...
MatthewD

4
std::shared_ptrおよびを持つC ++ 11には関連しなくなりましたstd::unique_ptr
einpoklum 2016年

49

BOOST_FOREACHは人生を再び価値あるものにします。

(なぜこれについて誰も言及しなかったのですか?8か月前に質問されました!)


15
「条件付きの愛」に関するEric Nieblerの記事(artima.com/cppsource/foreach.html)は、BOOST_FOREACHがどのように機能するかを説明しています。それはかなりクレイジーです。
ジェフハーディ

2
C ++ 11とラムダでそれほど人気が​​なくなった...
einpoklum

34

私のお気に入りは、順不同です:

  • 正規表現
  • ファイルシステム
  • lexical_cast
  • program_options(素晴らしいです!)
  • テスト(私のすべてのユニットテストのニーズに対応)。
  • 文字列アルゴリズム
  • 文字列トークナイザー
  • フォーマット(タイプセーフなprintfスタイルの文字列フォーマット)
  • スマートポイント

最初のクロスプラットフォームアプリを作成したとき、Boostは大きな助けになりました-それがなければ、本当に苦労しました。


4
C ++ 11 / C ++ 14に更新してください...
einpoklum

28

に独自のデストラクタを提供する方法が好きですshared_ptr
つまり、たとえば、それを使用してFILE*ファイルを閉じることができます。
例えば

void safeclose(FILE*fp) {
    if(fp) {
        fclose(fp);
    }
}
void some_fn() {
    boost::shared_ptr<FILE> fp( fopen(myfilename, "a+t"), safeclose );
    //body of the function, and when ever it exits the file gets closed
    fprintf( fp.get(), "a message\n" );
}

1
私はそれがほぼ2年後であることを知っていますがNULL、ローカル関数パラメーターを割り当てるので、...への割り当ては無意味です。:)
Xeo

1
@Xeoに感謝、私はそれを削除しました
hamishmcn

22

マルチインデックスコンテナについては誰も触れていないので、後でお知らせします。必要なのはそれほど頻繁ではありませんが、Boostを使用しないと、同等のデータ構造を作成することと、効率が低下することは非常に困難です。私は最近、2つのキーを検索するコンテナーを作成するためにそれらを頻繁に使用しています。


20

誰も言及していないことに驚いていboost::optionalます。とを除いてshared_ptr、Boostのどの部分よりも頻繁に使用していますscoped_ptr


1
すぐstd::experimental::optionalに(C ++ 17?)として利用可能になりましたstd::optional
einpoklum 2016年

1
うん、私はそれについてとても幸せです。:-)標準と私が使用するすべてのコンパイラでのそれらの完全な実装との間の遅延を考慮しても、それに依存できるようになるまでにはまだ時間がかかります... C ++ 11を昨年のプロジェクト。:-(
オタクの頭

実際、ほとんどのコンパイラは、近年の標準に適合していると思います。GCCとclangは、リリース時にC ++ 14をサポートしていましたね。とにかく、コメントを回答に組み込むことを検討してください。
einpoklum 2016年

@HeadGeek興味深いことに、8年後に回答に新しいコメントが追加されて、あなたは返信しました。
2016年

うわー...私はそれを推測し 8年ぶり。カエルのカーミットが言うように、あなたがハエを持っているときは時間は楽しいです。;-)
オタクの頭

19

boost :: tupleについて誰も言及していませんか?残念!


2
として利用可能になりましたstd::tuple
Dmitri Nesteruk 2014年

11

BOOST_STATIC_ASSERT

アップデート(2011年10月):C ++ 11(C ++ 0x)にstatic_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert


5
BOOST_MPL_ASSERT_MSGを使用すると、BOOST_STATIC_ASSERTが提供する不完全なタイプのメッセージのsizeofよりもはるかに有益な、読み取り/スポットエラーを非常に簡単に見つけることができます。
KitsuneYMG 2009年

ここここ!テストマクロBOOST_CHECK_CLOSE内でこれらの不完全な型エラーの1つを見つけました-(int、int、float)で呼び出したと思った前に、何が起こっているのか理解するのに半日かかりました。整数を浮動小数点にキャストすると、エラーはなくなりました。しかし、それが不完全な型とどう関係しているのかは本当にわかりません:)
ジェイミークック

9

私が最もよく使用しているものの1つはBoost固有のものではありませんが、Boostの上に構築されたAdobe Source Libraries(ASL)です。具体的には、個別の開始/終了反復子の代わりにboost :: rangeを受け入れる標準アルゴリズムの拡張機能です。次に、電話をかける代わりに、

std::for_each(some_container.begin(), some_container.end(), do_something());

簡単に言えます

adobe::for_each(some_container, do_something());

(ASLのこれらの部分が最終的にBoostに移行することを願っています。)


私はそれが好きです、私はASLをチェックします
hamishmcn 2010年

8

私はたくさん使います:

  • boost :: signals
  • boost :: shared_ptr
  • boost :: lexical_cast
  • boost :: bind
  • ブースト::ランダム
  • boost :: thread
  • boost :: noncopyable

Tuple、Static Assert、Integerなどの他のものは、さまざまなプラットフォームで使用される予定のライブラリを作成している場合に非常に役立ちます。

グラフやラムダのようなものはより具体的です。


C ++ 11/14のこれらの日のために更新してください(または回答を削除することを検討してください)。
einpoklum 2016年

8

boost::shared_ptr現代のC ++プログラミングIMHOの要件です。それがTR1で標準に追加した理由です。boost::program_optionsboost::bindboost::signalあなたは彼らが何であるかを知っているとどのようにそれらを使用する場合は本当に素晴らしいです。最後の2つは、初心者を怖がらせる傾向があります。


7

boost :: spiritは、ビジネスソリューションがECMAScriptを解析するのに非常に役立つことがわかりました。複雑ですが、とてもいいです!



7

ここ数年、shared_ptrを使用しています。それはとても便利で、プロジェクトにそれがなければならない理由はありません。

その上で、汎用のコールバックメカニズムにもBind / Function / Lambdaを使用します(特にテスト時に役立ちます)。また、汎用のsprintfを置き換えるためにFormatを使用しています。

最後に、問題を解決するために怒りの中でVariantを使用したのはちょうど先日でした(小さな、固定された無関係なトークンタイプのセットで応答できるパーサー)。解決策は非常にエレガントで、とても満足しています。


年月が経ち、時間が変わったので、更新の時間です。SharedPtrとFunctionは標準の一部になり、BindとLambdaは実際の言語レベルのラムダ機能によって廃止されました。

私はまだVariant(これも標準化されていますが、まだそこにはありません)を使用しています。Formatは、ほとんどがfmtlib(これも標準化されています)に置き換えられています。

私が使用するBoostの大部分はBoost.Asioです。これは標準化の過程にあります。


1
上記のすべてに同意します-Lambdaを除く。しばらく使ってみたのですが、曲がりくねったので、一番シンプルな表現以外はあきらめました。C ++ 0xとその形式のラムダ式を待ち望んでいます。
ヘッドオタク

Boost.Lambdaがあらゆる種類の落とし穴でいっぱいであることに同意します-UnlambdaまたはProtectの領域に入るとすぐに、私はあきらめて古い方法でそれを行いますが、コールバックを適切な方法で拡張するために不可欠であるようです。とはいえ、私もC ++ 0xの実装を待っています。
Kaz Dragon、

6

次のように、タプルを使用してマップを反復します。

string key, value;
BOOST_FOREACH(tie(key, value), my_map) { ... }

ブースト割り当てを使用して、次のようにマップを初期化できます。

map<string, string> my_map = map_list_of("key1", "value1")("key2", "value2")("key3", "value3");

そして、範囲アダプターとpipe( "|")演算子を使用して、(例として)マップの値を逆方向に反復できます。

BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }

1
かっこいい。ブースト割り当てのドキュメントを読むことができます:boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn

5

boost :: program_optionsを確認してください。コマンドラインの解析がはるかに簡単になります。


5

shared_ptrSのSTLコンテナーよりもBoost Pointer Containersを使用しています。



3

私はboost :: randomとboost :: asioとboost :: filesystemが大好きですが、boost :: bind、boost :: circular_buffer、boost :: threadは非常に実用的ですが、スマートポインターは大丈夫ですが、メモリ管理としてRAIIを優先します


6
スマートポインタはRAIIです。
Eclipse、

4
より正確には、スマートポインタは、メモリを動的に割り当てる以外に選択肢がない場合にRAIIを提供します。
ブラナン、2009

3

さて、これが私が見つけた新しいものです:stricmpを使用する
代わりに、ブーストのequals関数を使用してis_iequal述語を渡すことができます。 例: 代わりに

stricmp( "avalue", mystr.c_str() ) == 0

私は使えます

equals( "avalue", mystr, is_iequal() ) 

与えられた:

#include <boost/algorithm/string.hpp>
using namespace boost::algorithm;

3

これが私の2セントです。

  • boost :: scope_exit-一度だけ使用するためにRAIIクラスを定義する必要はない
  • boost :: any
  • boost :: variant
  • ブーストポインターコンテナーライブラリ(ptr_vector)
  • ブーストプールライブラリ
  • boost :: unordered_map / boost :: unordered_set

3

boost::iclはテキストの後処理にかなりの量を使用しています。それ以外の場合は自分でテキスト分割を実装する必要があるため、かなりの時間を節約できました...

BOOST_FOREACH 私のコードのどこにでもあります:)

boost::functionそしてboost::bind絶対必要です。今ではstd::functionありstd::bindますが。これらは本当に不要なコードの量を減らすのに役立ち、一般的に私のデザイン(または私の妄想)に適しています。

私は最近使い始めましたがboost::interprocess::message_queue、これも素晴らしいツールです。

私はもっ​​とたくさん使いますが、QtにはBoostが行う多くのことを行うネイティブの方法があります。純粋なC ++をプログラムする必要がある場合、私はboost::junkie:)になると思います


3

私が最もよく使用するものがTR1で使用できるようになりました。

  • 共有ポインタ
  • 配列クラス

現在は、プールクラスなど、より具体的なものも使用しています。

これで、Boostがほとんどのプログラマーに役立つことを理解したので、これが将来の標準ライブラリのテストベッドになります。


1

boost :: lexical_castについて言えば、「format」のようなものがstd :: stringライブラリの静的メンバーではないのはなぜですか?
ほとんどすべてのGUIライブラリには、CString :: Format( "%i")またはQString :: Number( "%i")のようなものがあり、初期化された文字列を返します。


4
例: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
Rob

タイプセーフを省略してもかまわない場合は、vsnprintf()、省略記号(...)、va_list / stdarg.h、およびローカル(スタックベース)バッファーを使用して独自にロールできます。
Mr.Ree、2008年

2
std :: stringにはすでに71個の関数が多すぎます(私のものではなく、Herb Sutterのカウントによる)。詳細はgotw.ca/gotw/084.htmを参照してください:(a)なぜフォーマットをstd :: stringにする必要がないのか、(b)クラスメンバーよりも汎用アルゴリズムを記述する方が良い理由を説明するのに十分な情報があると思いますとにかく機能します。
スティーブジェソップ

4
または別の言い方をすれば、「C ++は外国のようなものです。彼らはそこでは物事が違う」;-)
Steve Jessop

1
フォーマットはライブラリの一部ではありません。C++を設計しているときにStroustrupに課せられた課題の1つは、タイプセーフなフォーマット済みI / Oライブラリの構築でした。明らかに、その結​​果は、iostreamで表示されるものです。どうやら、当時誰も補間について考えていなかったようです。おそらく誰かがフォーマットストリームを書き、伝統主義者がよりくつろげるようにしたいと思いますか?
Phil Miller

1

質問は逆転すべきだと思います。ブーストのどの部分を使いたくないですか?

私の経験では、ほとんどすべての問題領域で面白くて便利です。

興味の対象となる領域を見つけるために、ブーストのドキュメントをすべて調べて時間を費やす必要があります。

例外の1つboost::numeric::ublasはその仕事をすることですが、アイゲンはそれを非常によくします。


octonionライブラリが多くの人に使用されているとは思えません。
ペッター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.