Bagian Boost yang paling sering digunakan [tutup]


115

Ketika saya menemukannya, boost::lexical_castsaya berpikir "mengapa saya tidak tahu tentang ini lebih awal!" - Aku benci harus menulis kode seperti

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

Sekarang saya menulis

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

Kemarin, di stackoverflow, saya menemukan boost split (permata lain yang akan menyelamatkan saya untuk menulis kode).

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

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

Saya akan mulai melihat-lihat dokumentasi boost untuk mencari fungsi lain yang dapat saya gunakan secara teratur, tetapi saya rasa akan sangat mudah untuk melewatkan banyak hal.

Fungsi pendorong apa yang paling Anda gunakan / tidak suka jika tidak dimiliki?


1
Karena tertarik, apa yang menghentikan Anda menulis fungsi "ubah angka menjadi string" sebelum Anda menggunakan Boost? Saya telah melihat duplikasi dan menulis template sederhana dan menggunakannya dan kemudian, mungkin, beralih ke versi boost ketika saya menemukannya ...
Len Holgate

4
Hai Len, Pada waktu yang berbeda pada proyek yang berbeda, saya telah menulis fungsi "ToStr" dalam kerangka, tetapi kemudian saya akan beralih ke beberapa proyek lain, kemudian akhirnya menulis 3-liner karena saya hanya ingin menyelesaikan hal terkutuk: - ) dibandingkan dengan overhead pembuatan file "misc_funcs"
hamishmcn

Jawaban:


62

Mungkin bagian dari boost yang paling sering saya gunakan adalah boost :: shared_ptr .


13
Juga mungkin paling sering digunakan. Saya sendiri telah mempelajari pelajaran ini dengan cara yang sulit dengan harus merefaktor sebagian besar penggunaan shared_ptr dengan referensi, wadah penunjuk, dan auto_ptr. Saya sekarang sebagian besar setuju dengan ini: bureau14.fr/blogea/index.php/2009/08/…
amit

1
@phaedrus: Tautan diperbarui: blogea.bureau14.fr/index.php/2009/08/…
MatthewD

4
Tidak lagi relevan di C ++ 11 yang memiliki std::shared_ptrdan std::unique_ptr.
einpoklum


34

Favorit saya, tanpa urutan tertentu:

  • regex
  • berkas sistem
  • benang
  • lexical_cast
  • program_options (luar biasa!)
  • test (untuk semua kebutuhan pengujian unit saya).
  • Algoritme string
  • Tokenizer string
  • format (pemformatan string gaya printf tipe aman)
  • ptrs pintar

Boost adalah bantuan besar ketika saya menulis aplikasi lintas platform pertama saya - tanpanya saya benar-benar akan kesulitan.


4
Perbarui untuk C ++ 11 / C ++ 14 ...
einpoklum

28

Saya suka bagaimana Anda dapat menyediakan destruktor Anda sendiri shared_ptr.
Artinya, misalnya, Anda dapat menggunakannya dengan FILE*dan menutup file untuk Anda.
misalnya

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
Saya tahu itu hampir dua tahun kemudian, tapi ... penugasan itu ke NULLtidak berguna, karena menetapkan parameter fungsi lokal. :)
Xeo

1
Terima kasih @Xeo, saya telah menghapusnya
hamishmcn

22

Tidak ada yang menyebutkan Multi-Index Containers jadi saya akan berpadu terlambat. Anda tidak terlalu sering membutuhkannya, tetapi tanpa peningkatan akan sangat merepotkan untuk membuat struktur data yang setara, serta menjadi kurang efisien. Saya telah banyak menggunakannya baru-baru ini untuk membuat wadah yang mencari 2 kunci.


20

Saya terkejut bahwa tidak ada yang menyebutkan boost::optional. Saya mendapati diri saya menggunakannya lebih sering daripada bagian Boost mana pun kecuali shared_ptrdan scoped_ptr.


1
Sekarang tersedia sebagai std::experimental::optionaldan segera (C ++ 17?) Sebagai std::optional.
einpoklum

1
Ya, dan saya sangat senang karenanya. :-) Meskipun mempertimbangkan penundaan antara standar dan implementasi penuhnya di semua kompiler yang saya gunakan, masih perlu beberapa saat sebelum saya dapat bergantung padanya ... Saya baru saja dapat mulai menggunakan C ++ 11 pada sebuah proyek tahun lalu. :-(
Kepala Geek

Sebenarnya saya pikir sebagian besar kompiler ok wrt memenuhi standar dalam beberapa tahun terakhir - GCC dan clang mendukung C ++ 14 ketika dirilis, bukan? Bagaimanapun, mohon pertimbangkan untuk mengintegrasikan komentar Anda ke dalam jawaban Anda.
einpoklum

@HeadGeek Menarik untuk melihat komentar baru ditambahkan ke jawaban Anda setelah 8 tahun, dan Anda menanggapi!
Deqing

Wow ... Saya kira itu sudah delapan tahun. Seperti yang dikatakan Kermit the Frog, waktu menyenangkan saat Anda sedang bersenang-senang. ;-)
Kepala Geek

19

Tidak ada yang menyebutkan boost :: tuple? Karena malu!


2
Sekarang tersedia sebagai std::tuple.
Dmitri Nesteruk

11

BOOST_STATIC_ASSERT

Pembaruan (Oktober 2011): C ++ 11 (C ++ 0x) memiliki static_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert


5
BOOST_MPL_ASSERT_MSG memungkinkan kesalahan yang sangat mudah dibaca / ditemukan yang jauh lebih informatif daripada ukuran pesan jenis tidak lengkap yang diberikan BOOST_STATIC_ASSERT.
KitsuneYMG

sini sini! Saya baru saja menemukan salah satu dari jenis kesalahan yang tidak lengkap ini di dalam makro pengujian BOOST_CHECK_CLOSE - butuh waktu setengah hari untuk mencari tahu apa yang terjadi sebelum saya mencabut yang saya sebut dengan (int, int, float); setelah saya melemparkan bilangan bulat ke floating point, kesalahan itu hilang. Tapi apa hubungannya dengan tipe yang tidak lengkap saya benar-benar tidak tahu :)
Jamie Cook

9

Salah satu yang paling sering saya gunakan tidak di Boost, tetapi Adobe Source Libraries (ASL) dibangun di atas Boost - khususnya, ekstensi ke algoritme standar yang menerima boost :: range sebagai pengganti iterator start / end yang terpisah. Lalu, alih-alih menelepon, katakan,

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

Saya hanya bisa mengatakan

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

(Saya berharap bagian ASL ini bermigrasi ke Boost pada akhirnya.)


Saya suka, saya akan memeriksa ASL
hamishmcn

8

Saya banyak menggunakan:

  • meningkatkan :: sinyal
  • boost :: shared_ptr
  • meningkatkan :: lexical_cast
  • meningkatkan :: mengikat
  • meningkatkan :: acak
  • meningkatkan :: utas
  • boost :: tidak dapat disalin

Lainnya seperti Tuple, Static Assert dan Integer sangat berguna jika Anda menulis perpustakaan yang akan digunakan pada berbagai platform.

Hal-hal seperti Grafik dan Lambda lebih spesifik.


Harap perbarui untuk C ++ 11/14 hari ini (atau pertimbangkan untuk menghapus jawabannya).
einpoklum

8

boost::shared_ptradalah persyaratan untuk pemrograman C ++ modern IMHO. Itu sebabnya mereka menambahkannya ke standar dengan TR1. boost::program_options,, boost::binddan boost::signalsangat baik jika Anda tahu kegunaannya dan cara menggunakannya. Dua yang terakhir cenderung menakut-nakuti pendatang baru.


7

Kami menemukan boost :: spirit cukup berguna untuk solusi bisnis untuk mengurai ECMAScript. Kompleks, tapi sangat bagus!



7

Saya telah menggunakan shared_ptr selama bertahun-tahun sekarang. Itu sangat berguna, tidak ada alasan sebuah proyek harus tanpa itu.

Selain itu, saya juga menggunakan Bind / Function / Lambda untuk mekanisme callback umum - terutama berguna saat menguji - serta Format untuk penggantian sprintf tujuan umum saya.

Akhirnya, hanya beberapa hari yang lalu ketika saya menggunakan Variant in angry untuk memecahkan masalah (parser yang dapat merespon dengan set kecil tipe token yang tidak berhubungan). Solusinya sangat elegan, dan saya sangat senang dengannya.


Tahun telah berlalu dan waktu telah berubah, jadi waktu untuk pembaruan. SharedPtr dan Function sekarang menjadi bagian dari Standard, dan Bind serta Lambda ditinggalkan oleh fungsi lambda tingkat bahasa yang sebenarnya.

Saya masih menggunakan Varian (yang juga telah distandarisasi, tetapi saya belum sampai ke sana), Format sebagian besar digantikan oleh fmtlib (yang juga telah distandarisasi).

Bagian besar Boost yang saya gunakan adalah Boost.Asio. Yang sedang dalam proses distandarisasi.


1
Saya setuju dengan semua hal di atas - kecuali Lambda. Saya menggunakannya untuk sementara waktu, tetapi sangat berliku-liku sehingga saya mengabaikannya untuk semua kecuali ekspresi yang paling sederhana. Menunggu C ++ 0x dan bentuk ekspresi lambda-nya.
Kepala Geek

Saya setuju bahwa Boost.Lambda penuh dengan segala macam jebakan - segera setelah saya memasuki alam Unlambda atau Lindungi, saya menyerah dan melakukannya dengan cara lama, tetapi tampaknya penting dalam memperpanjang panggilan balik dengan cara yang setengah layak . Karena itu, saya juga menunggu implementasi C ++ 0x.
Kaz Dragon

6

Menggunakan tupel untuk mengulang peta, seperti ini:

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

Dengan menggunakan boost assign, saya bisa menginisialisasi peta seperti ini:

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

Dan dengan menggunakan adaptor jangkauan dan operator pipa ("|"), saya dapat mengulangi nilai peta (sebagai contoh):

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

1
Itu keren sekali. Itu membuat saya membaca dokumentasi untuk tugas peningkatan: boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn

5

Anda harus memeriksa boost :: program_options. Itu membuat penguraian baris perintah lebih mudah.


5

Saya menggunakan Boost Pointer Containers sebagai preferensi ke wadah STL shared_ptrs.



3

Saya suka boost :: random dan boost :: asio dan boost :: filesystem, namun boost :: bind, boost :: circular_buffer dan boost :: thread sangat praktis, petunjuk cerdas tidak masalah tetapi saya lebih suka RAII daripada sebagai manajemen memori


6
Petunjuk cerdas adalah RAII.
Gerhana

4
lebih tepatnya, Smart pointer memberi Anda RAII saat tidak ada pilihan selain mengalokasikan memori secara dinamis.
Branan

3

Oke, ini yang baru saya temukan:
Alih-alih menggunakan stricmp saya bisa menggunakan fungsi sama dengan boost dan meneruskan predikat is_iequal
misalnya:
daripada

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

Saya bisa menggunakan

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

diberikan:

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

3

Ini dua sen saya:

  • boost :: scope_exit - tidak perlu mendefinisikan kelas RAII hanya untuk sekali penggunaan
  • meningkatkan :: apa saja
  • boost :: varian
  • Boost Pointer Container Library (ptr_vector)
  • Boost Pool Library
  • boost :: unordered_map / boost :: unordered_set

3

Saya menggunakan boost::iclcukup banyak untuk pemrosesan pasca teks. Menghemat cukup banyak waktu bagi saya karena jika tidak, saya sendiri harus menerapkan pemisahan teks ...

BOOST_FOREACH ada di mana-mana di kode saya :)

boost::functiondan boost::bindmerupakan keharusan mutlak. Meskipun sekarang mereka std::functiondan std::bind. Ini benar-benar membantu mengurangi jumlah kode yang tidak perlu dan umumnya bagus untuk desain saya (atau delusi saya).

Saya baru saja mulai menggunakan boost::interprocess::message_queuedan ini adalah alat yang hebat juga.

Saya akan menggunakan lebih banyak, tetapi Qt memiliki cara asli untuk melakukan banyak hal yang dilakukan Boost. Jika saya harus memprogram C ++ murni, saya rasa saya akan menjadi boost::junkie:)


3

Yang paling sering saya gunakan sekarang tersedia di TR1:

  • petunjuk bersama
  • kelas array

Sekarang saya juga menggunakan kelas biliar dan beberapa hal lain yang lebih spesifik.

Anda sekarang mengerti bahwa Boost dimaksudkan untuk berguna bagi sebagian besar pemrogram, itulah mengapa ini menjadi tempat pengujian untuk pustaka standar masa depan.


1

Berbicara tentang boost :: lexical_cast, mengapa tidak ada sesuatu seperti 'format' menjadi anggota statis di pustaka std :: string?
Hampir semua gui lib memiliki sesuatu seperti CString :: Format ("% i") atau QString :: Number ("% i") yang mengembalikan string yang diinisialisasi.


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

Jika Anda ingin mengabaikan keamanan tipe, Anda dapat menggulung sendiri dengan vsnprintf (), ellipsis (...), va_list / stdarg.h, dan buffer lokal (berbasis tumpukan).
Tn. Ree

2
std :: string sudah memiliki 71 fungsi terlalu banyak (menurut hitungan Herb Sutter, bukan milik saya). Lihat gotw.ca/gotw/084.htm untuk detailnya: Saya pikir ini memiliki cukup info untuk menjelaskan (a) mengapa format tidak perlu dalam std :: string, dan (b) mengapa lebih baik menulis algoritma generik daripada anggota kelas berfungsi.
Steve Jessop

4
Atau dengan kata lain, "C ++ seperti negara asing: mereka melakukan sesuatu secara berbeda di sana" ;-)
Steve Jessop

1
Format bukan bagian dari pustaka karena salah satu tantangan yang diajukan Stroustrup saat dia mendesain C ++ adalah pembangunan pustaka I / O berformat yang aman. Jelas, hasilnya adalah apa yang Anda lihat dengan iostreams. Rupanya, tidak ada yang memikirkan interpolasi pada saat itu. Mungkin seseorang ingin menulis formatstream, untuk membuat tradisionalis merasa lebih betah?
Phil Miller

1

Saya pikir pertanyaannya harus dibalik. Bagian mana dari boost yang tidak ingin Anda gunakan?

Dalam pengalaman saya, cukup banyak semua itu menarik dan berguna di setiap domain masalah.

Anda harus meluangkan waktu untuk melihat-lihat dokumentasi pendorong untuk menemukan area yang mencakup minat Anda.

Satu pengecualian mungkin adalah boost::numeric::ublasyang melakukan tugasnya, tetapi Eigen melakukannya dengan sangat lebih baik.


Saya ragu perpustakaan oktonion digunakan oleh banyak orang.
Petter
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.