Boost'un en çok kullanılan bölümleri [kapalı]


116

Keşfettiğimde boost::lexical_castkendi kendime "neden bunu daha önce bilmiyordum!" Diye düşündüm. - Şunun gibi kod yazmaktan nefret ediyordum

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

Şimdi yazıyorum

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

Dün, stackoverflow'da, boost split ile karşılaştım (kod yazmamı sağlayacak başka bir mücevher).

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

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

Düzenli olarak kullanabileceğim diğer işlevleri aramak için destek belgelerine bakmaya başlayacağım, ancak bazı şeyleri gözden kaçırmanın çok kolay olacağını hissediyorum.

En çok hangi destek işlevlerini kullanıyorsunuz / sahip olmamaktan nefret edersiniz?


1
Boost'u kullanmadan önce kendi "sayıyı dizgeye dönüştürme" işlevinizi yazmanıza ne engel oldu? Çoğaltmayı görmüştüm ve basit bir şablon yazmıştım ve bunu kullandım ve sonra, bulduğumda belki de yükseltme sürümüne geçtim ...
Len Holgate

4
Merhaba Len, Farklı projelerde farklı zamanlarda şablonlu bir "ToStr" işlevi yazdım, ancak sonra başka bir projeye geçip 3 satır yazmayı bıraktım çünkü sadece lanet olası şeyi yapmak istedim: - ) "misc_funcs" dosyası oluşturma ek yükünün aksine
hamishmcn

Yanıtlar:


62

Muhtemelen boost'un benim için en çok kullanılan kısmı boost :: shared_ptr .


13
Ayrıca muhtemelen çok fazla kullanılır. Paylaşılan_tr'nin kullanımlarının çoğunu referanslar, işaretçi kapsayıcıları ve auto_ptr ile yeniden düzenlemek zorunda kaldığım için dersi zor yoldan öğrendim. Şimdi çoğunlukla bunu kabul ediyorum: bureau14.fr/blogea/index.php/2009/08/…
amit

1
@phaedrus: Güncellenen bağlantı: blogea.bureau14.fr/index.php/2009/08/…
MatthewD

4
Artık std::shared_ptrve olan C ++ 11 ile alakalı değil std::unique_ptr.
einpoklum


35

Benim favorilerim, belirli bir sırayla:

  • regex
  • dosya sistemi
  • Konu
  • lexical_cast
  • program_options (sadece mükemmel!)
  • test (tüm birim test ihtiyaçlarım için).
  • Dize algoritmaları
  • Dize jetonlaştırıcı
  • format (tür güvenli printf stili dize formatlaması)
  • akıllı ptrs

Boost, ilk platformlar arası uygulamamı yazdığımda çok büyük bir yardımdı - o olmasaydı gerçekten zorlanırdım.


4
Lütfen C ++ 11 / C ++ 14 için güncelleyin ...
einpoklum

28

Kendi yok edicinizi nasıl tedarik edebileceğinizi seviyorum shared_ptr.
Bu, örneğin, onu kullanabileceğiniz FILE*ve dosyayı sizin için kapatabileceğiniz anlamına gelir .
Örneğin

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
Neredeyse iki yıl sonra olduğunu biliyorum, ama ... NULLyerel fonksiyon parametresini atadığı için bu atama işe yaramaz. :)
Xeo

1
Teşekkürler @Xeo, onu kaldırdım
hamishmcn

22

Hiç kimse Multi-Index Container'lardan bahsetmedi, bu yüzden geç saatlerde çalacağım. Onlara o kadar sık ​​ihtiyaç duymazsınız, ancak destek olmadan eşdeğer bir veri yapısı oluşturmak ve daha az verimli olmak gerçek bir acıdır. Son zamanlarda onları 2 tuşa bakan kaplar oluşturmak için kullanıyorum.


20

Kimsenin bahsetmemesine şaşırdım boost::optional. Kendimi Boost'un shared_ptrve dışında herhangi bir bölümünden daha sık kullanırken buluyorum scoped_ptr.


1
Şimdi en std::experimental::optionalkısa sürede (C ++ 17?) std::optional.
einpoklum

1
Evet ve bundan çok memnunum. :-) Standartlar arasındaki gecikmeyi ve kullandığım tüm derleyicilerde bunların tam olarak uygulanmasını göz önünde bulundurursak, yine de ona güvenebilmem için biraz zaman geçecek ... C ++ 11'i kullanmaya başlayabildim geçen yıl bir proje. :-(
Head Geek

Aslında, çoğu derleyicinin son yıllarda standartları karşılamada iyi olduğunu düşünüyorum - GCC ve clang piyasaya çıktığında C ++ 14'ü destekledi, değil mi? Her neyse, lütfen yorumunuzu cevabınıza entegre etmeyi düşünün.
einpoklum

@HeadGeek 8 yıl sonra cevabınıza yeni bir yorum eklendi ve siz yanıtladınız!
Deqing

Vay ... Ben sanırım etmiştir sekiz yıldır. Kurbağa Kermit'in dediği gibi, sinek varken zaman eğlencelidir. ;-)
Head Geek

19

Kimse boost :: tuple'dan bahsetmiyor mu? Utanç!


2
Şimdi olarak mevcuttur std::tuple.
Dmitri Nesteruk

11

BOOST_STATIC_ASSERT

Güncelleme (Ekim 2011): 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'in verdiği tamamlanmamış tip mesajdan çok daha bilgilendirici olan hataları okumayı / tespit etmeyi çok kolaylaştırır.
KitsuneYMG

Burası burası! BOOST_CHECK_CLOSE test makrosunun içinde bu eksik tür hatalarından birini buldum - (int, int, float) ile çağırdığım twiglemeden önce neler olup bittiğini anlamam yarım gün sürdü; Tam sayıları kayan noktaya attığımda hata ortadan kalktı. Ama gerçekten :) bilmiyorum tamamlanmamış bir türüyle vardır ne yapmalı
Jamie Cook

9

En çok kullandığımlardan biri Boost'ta değil, Boost'un üzerine inşa edilen Adobe Source Libraries (ASL) - özellikle, ayrı başlangıç ​​/ bitiş yinelemeleri yerine bir boost :: range kabul eden standart algoritmaların uzantıları. Sonra aramak yerine,

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

Basitçe söyleyebilirim

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

(ASL'nin bu bölümlerinin sonunda Boost'a taşınmasını umuyorum.)


Bunun gibi, ben ASL kontrol eder
hamishmcn

8

Ben çok kullanıyorum:

  • boost :: sinyalleri
  • boost :: shared_ptr
  • boost :: lexical_cast
  • boost :: bağlamak
  • boost :: rasgele
  • boost :: thread
  • boost :: noncopyable

Tuple, Static Assert ve Integer gibi diğerleri, çeşitli platformlarda kullanılması gereken bir kitaplık yazıyorsanız çok kullanışlıdır.

Grafikler ve Lambda gibi şeyler daha belirgindir.


Lütfen bu günler için C ++ 11/14 güncelleyin (veya yanıtı kaldırmayı düşünün).
einpoklum

8

boost::shared_ptrmodern C ++ programlama IMHO için bir gerekliliktir. Bu yüzden TR1 ile standarda eklediler. boost::program_options, boost::bindve boost::signalne işe yaradıklarını ve nasıl kullanılacağını biliyorsanız gerçekten çok hoşlar. Son ikisi yeni gelenleri korkutma eğilimindedir.


7

ECMAScript'i ayrıştırmak için bir iş çözümü için boost :: spirit'ı oldukça yararlı bulduk. Karmaşık ama çok güzel!



7

Yıllardır shared_ptr kullanıyorum. O kadar kullanışlı ki, bir projenin onsuz olması için hiçbir sebep yok.

Bunun da ötesinde, genel geri arama mekanizmaları için Bind / Function / Lambda kullanıyorum - özellikle test ederken kullanışlıdır - ve genel amaçlı sprintf değişimim için Format.

Son olarak, bir problemi çözmek için Variant'ı öfkeyle kullandığım gündü (küçük, sabit bir ilgisiz simge türleriyle yanıt verebilecek bir ayrıştırıcı). Çözüm çok zarifti ve bundan çok memnunum.


Yıllar geçti ve zamanlar değişti, bu yüzden güncelleme zamanı. SharedPtr ve Function artık Standard'ın bir parçasıdır ve Bind ve Lambda, gerçek dil düzeyinde lambda işlevi tarafından kullanılmaz hale getirilmiştir.

Hala standartlaştırılmış olan Variant'ı kullanıyorum, ancak henüz orada değilim, Format büyük ölçüde fmtlib ile değiştirildi (bu da standartlaştırıldı).

Boost'un kullandığım büyük kısmı Boost.Asio. Standardize edilme sürecinde olan.


1
Yukarıdakilerin hepsine katılıyorum - Lambda hariç. Bir süre kullandım, ama o kadar dolambaçlı ki en basit ifadeler dışında hepsini terk ettim. C ++ 0x'i ve lambda ifadelerinin biçimini merakla bekliyor.
Baş Geek

Boost.Lambda'nın her türlü tuzakla dolu olduğunu kabul ediyorum - Unlambda veya Protect dünyasına girer girmez pes ediyorum ve bunu eski şekilde yapıyorum, ancak geri aramaları yarı düzgün bir şekilde genişletmek için gerekli görünüyor . Bununla birlikte, ben de C ++ 0x uygulamasını bekliyorum.
Kaz Dragon

6

Bir haritayı yinelemek için tuple kullanma, örneğin:

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

Hızlandırma atamasını kullanarak, şu şekilde bir haritayı başlatabilirim:

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

Aralık bağdaştırıcılarını ve dikey çizgi ("|") operatörünü kullanarak bir haritanın değerleri üzerinde geriye doğru yineleme yapabilirim (örnek olarak):

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

1
Bu gerçekten havalı. Yükseltme
sağladı


5

Boost Pointer Container'ları bir STL kapsayıcı shared_ptrs.



3

Boost :: random ve boost :: asio ve boost :: filesystem'i seviyorum, ancak boost :: bind, boost :: round_buffer ve boost :: thread çok pratik, akıllı işaretçiler tamam ama bellek yönetimi yerine RAII'yi tercih ediyorum


6
Akıllı işaretçiler RAII'dir.
Eclipse

4
daha doğrusu, Akıllı işaretçiler belleği dinamik olarak ayırmaktan başka seçenek olmadığında size RAII verir.
Branan

3

Tamam, buldum yeni biri:
Yerine kullanmanın stricmp ben artırmak en kullanabilirsiniz eşittir işlev ve is_iequal yüklem geçmek
örn:
yerine

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

kullanabilirim

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

verilen:

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

3

İşte benim iki sentim:

  • boost ::cope_exit - RAII sınıfını tek kullanımlık tanımlamaya gerek yok
  • artırmak :: herhangi
  • boost :: varyant
  • İşaretçi Konteyner Kitaplığını Artırın (ptr_vector)
  • Havuz Kitaplığını Artırın
  • boost :: unordered_map / boost :: unordered_set

3

boost::iclMetin son işleme için oldukça fazla kullanıyorum . Bana epey zaman kazandırdı çünkü aksi halde metin bölmeyi kendim uygulamak zorunda kalırdım ...

BOOST_FOREACH kodumun her yerinde :)

boost::functionve boost::bindmutlak bir zorunluluktur. Şimdi olmasına rağmen std::functionve std::bind. Bunlar gerçekten gereksiz kod miktarını azaltmaya yardımcı oluyor ve genellikle tasarımlarım (veya hayaletlerim) için iyi.

Yakın zamanda kullanmaya başladım boost::interprocess::message_queueve bu da harika bir araç.

Çok daha fazlasını kullanırdım, ancak Qt, Boost'un yaptığı birçok şeyi yapmak için yerel yöntemlere sahiptir. Saf C ++ programlamam gerekirse, sanırım bir boost::junkie:)


3

En çok kullandığım şey artık TR1'de mevcut:

  • paylaşılan işaretçiler
  • dizi sınıfı

Şimdi ayrıca havuz dersleri ve diğer bazı daha spesifik şeyleri de kullanıyorum.

Artık Boost'un çoğu programcı için yararlı olduğunu anlıyorsunuz, bu yüzden gelecekteki standart kitaplık için test ortamı bu.


1

Boost :: lexical_cast hakkında konuşurken, neden std :: string kitaplığında 'format' gibi bir statik üye değil?
Hemen hemen tüm gui kitaplıklarında, CString :: Format ("% i") veya QString :: Number ("% i") gibi, başlatılmış bir dizge döndüren bir şey vardır.


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

Tür güvenliğinden vazgeçmeye istekliyseniz, kendinize ait olanı vsnprintf (), ellipsis (...), va_list / stdarg.h ve yerel (yığın tabanlı) bir tampon ile yuvarlayabilirsiniz.
Mr.Ree

2
std :: string zaten 71 fonksiyona sahip (Herb Sutter'ın sayısına göre, benim değil). Ayrıntılar için gotw.ca/gotw/084.htm'ye bakın: (a) formatın neden std :: string'de olması gerektiğini ve (b) neden sınıf üyesinden daha genel algoritmalar yazmanın daha iyi olduğunu açıklamak için yeterli bilgiye sahip olduğunu düşünüyorum yine de çalışır.
Steve Jessop

4
Ya da başka bir deyişle, "C ++ yabancı bir ülke gibidir: orada işleri farklı yaparlar" ;-)
Steve Jessop

1
Stroustrup, C ++ 'ı tasarlarken ortaya çıkan zorluklardan biri, tür açısından güvenli biçimlendirilmiş bir G / Ç kitaplığının oluşturulması olduğu için, biçim kitaplığın bir parçası değildir. Açıkçası, sonuç, iostreams ile gördüğünüz şeydi. Görünüşe göre, o zamanlar kimse enterpolasyonu düşünmemişti. Belki birisi gelenekçilerin kendilerini evde hissetmelerini sağlamak için bir format akışı yazmak ister?
Phil Miller

1

Bence sorunun tersine çevrilmesi gerekiyor. Hangi parçanı kullanmak istemezsin ?

Tecrübelerime göre hemen hemen hepsi her problem alanında ilginç ve kullanışlıdır.

İlgi alanlarınızı kapsayan alanları bulmak için destek belgelerinin her yerine bakmalısınız.

boost::numeric::ublasİşini yapan bir istisna olabilir , ancak Eigen bunu dikkate değer ölçüde daha iyi yapıyor.


Octonion kütüphanesinin birçok kişi tarafından kullanıldığından şüpheliyim.
Petter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.