ส่วนที่ใช้มากที่สุดของ Boost [ปิด]


116

เมื่อฉันค้นพบ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

ฉันกำลังจะเริ่มดูเอกสารบูสต์โดยมองหาฟังก์ชั่นอื่น ๆ ที่ฉันจะสามารถใช้ได้เป็นประจำ แต่ฉันรู้สึกว่ามันจะพลาดง่ายมาก

คุณใช้ฟังก์ชันบูสต์อะไรมากที่สุด / ไม่ชอบที่จะมี?


1
คุณไม่สนใจอะไรที่ทำให้คุณเขียนฟังก์ชัน "แปลงตัวเลขเป็นสตริง" ของคุณเองก่อนที่คุณจะใช้ Boost? ฉันเคยเห็นการทำสำเนาและเขียนเทมเพลตง่ายๆและใช้สิ่งนั้นจากนั้นอาจเปลี่ยนไปใช้เวอร์ชันเพิ่มเมื่อฉันพบ ...
Len Holgate

4
สวัสดี Len ในช่วงเวลาที่แตกต่างกันในโครงการต่างๆฉันได้เขียนฟังก์ชัน "ToStr" ที่เป็นเทมเพลตแล้ว แต่จากนั้นฉันจะย้ายไปยังโครงการอื่นจากนั้นจึงเขียน 3 ซับเพราะฉันแค่อยากจะทำสิ่งที่ยี้ให้เสร็จ: - ) ซึ่งตรงข้ามกับค่าใช้จ่ายในการสร้างไฟล์ "misc_funcs"
hamishmcn

คำตอบ:


62

น่าจะเป็นส่วนที่ใช้มากที่สุดในการเพิ่มสำหรับฉันก็คือการเพิ่ม :: shared_ptr


13
อาจใช้มากเกินไป ฉันได้เรียนรู้บทเรียนนี้ด้วยวิธีที่ยากโดยต้องปรับเปลี่ยนการใช้งานส่วนใหญ่ของ shared_ptr โดยการอ้างอิงคอนเทนเนอร์ตัวชี้และ auto_ptr ตอนนี้ฉันเห็นด้วยกับเรื่องนี้เป็นส่วนใหญ่: bureau14.fr/blogea/index.php/2009/08/…
amit

1
@phaedrus: ลิงค์อัปเดต: blogea.bureau14.fr/index.php/2009/08/…
MatthewD

4
ไม่เกี่ยวข้องอีกต่อไปใน C ++ 11 ซึ่งมีstd::shared_ptrและstd::unique_ptr.
einpoklum

49

BOOST_FOREACHทำให้ชีวิตมีค่าอีกครั้ง

(ทำไมไม่มีใครพูดถึงเรื่องนี้คำถามถูกถามเมื่อ 8 เดือนก่อน!)


15
บทความของ Eric Niebler เรื่อง "Conditional Love" ( artima.com/cppsource/foreach.html ) อธิบายถึงวิธีการทำงานของ BOOST_FOREACH มันค่อนข้างบ้า
Jeff Hardy

2
ไม่นิยมใช้ C ++ 11 และ lambdas อีกต่อไป ...
einpoklum

35

รายการโปรดของฉันไม่ได้เรียงลำดับเป็นพิเศษ:

  • regex
  • ระบบแฟ้ม
  • เกลียว
  • lexical_cast
  • program_options (ยอดเยี่ยมมาก!)
  • ทดสอบ (สำหรับความต้องการการทดสอบหน่วยของฉันทั้งหมด)
  • อัลกอริทึมสตริง
  • โทเค็นสตริง
  • รูปแบบ (การจัดรูปแบบสตริงสไตล์ printf ที่ปลอดภัย)
  • ptrs ที่ชาญฉลาด

Boost เป็นความช่วยเหลือที่ยิ่งใหญ่เมื่อฉันเขียนแอปข้ามแพลตฟอร์มครั้งแรกโดยที่ฉันไม่ต้องดิ้นรนจริงๆ


4
โปรดอัปเดตสำหรับ C ++ 11 / C ++ 14 ...
einpoklum

28

ผมชอบวิธีการที่คุณสามารถจัดหา destructor 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
ฉันรู้ว่าเกือบสองปีต่อมา แต่ ... การมอบหมายให้NULLนั้นไร้ประโยชน์เนื่องจากกำหนดพารามิเตอร์ฟังก์ชันภายในเครื่อง :)
Xeo

1
ขอบคุณ @Xeo ฉันลบมันออกไป
hamishmcn

22

ไม่มีใครพูดถึงMulti-Index Containersดังนั้นฉันจะตีระฆังในช่วงสาย ไม่บ่อยนักที่คุณต้องการ แต่หากไม่มีการเพิ่มการสร้างโครงสร้างข้อมูลที่เทียบเท่ากันนั้นเป็นความเจ็บปวดอย่างแท้จริงรวมทั้งมีประสิทธิภาพน้อยกว่าด้วย เมื่อเร็ว ๆ นี้ฉันใช้มันบ่อยมากในการสร้างคอนเทนเนอร์ที่มีการค้นหา 2 คีย์


20

boost::optionalฉันประหลาดใจที่ไม่มีใครได้กล่าวถึง ฉันพบตัวเองใช้มันบ่อยกว่าส่วนใดส่วนหนึ่งของการเพิ่มยกเว้นและshared_ptrscoped_ptr


1
ตอนนี้ใช้ได้เป็นstd::experimental::optionalและเร็ว ๆ นี้ (C ++ 17?) std::optionalเป็น
einpoklum

1
ใช่และฉันมีความสุขมากกับมัน :-) แม้ว่าจะพิจารณาถึงความล่าช้าระหว่างมาตรฐานและการใช้งานเต็มรูปแบบในคอมไพเลอร์ทั้งหมดที่ฉันใช้ แต่ก็ยังต้องใช้เวลาสักครู่ก่อนที่ฉันจะสามารถพึ่งพาได้ ... ฉันเพิ่งสามารถเริ่มใช้ C ++ 11 ได้ โครงการเมื่อปีที่แล้ว :-(
Head Geek

จริงๆแล้วฉันคิดว่าคอมไพเลอร์ส่วนใหญ่ใช้ได้ตามมาตรฐานการประชุม wrt ในช่วงไม่กี่ปีที่ผ่านมา - GCC และ clang รองรับ C ++ 14 เมื่อเปิดตัวใช่ไหม อย่างไรก็ตามโปรดพิจารณารวมความคิดเห็นของคุณเข้ากับคำตอบของคุณ
einpoklum

@HeadGeek สนใจที่จะเห็นความคิดเห็นใหม่ที่เพิ่มเข้ามาในคำตอบของคุณหลังจาก 8 ปีและคุณตอบกลับ!
Deqing

ว้าว ... ผมคิดว่ามันได้รับแปดปี ดังที่ Kermit the Frog กล่าวว่าเวลาสนุกเมื่อคุณมีแมลงวัน ;-)
Head Geek

19

ไม่มีใครพูดถึง boost :: tuple? สำหรับความอัปยศ!


2
พร้อมให้บริการแล้วในรูปแบบstd::tuple.
Dmitri Nesteruk

11

BOOST_STATIC_ASSERT

อัปเดต (ตุลาคม 2554): 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 ให้ไว้
KitsuneYMG

ที่นี่ที่นี่! ฉันเพิ่งพบข้อผิดพลาดประเภทที่ไม่สมบูรณ์เหล่านี้ในมาโครการทดสอบ BOOST_CHECK_CLOSE - ใช้เวลาครึ่งวันในการคิดว่าเกิดอะไรขึ้นก่อนที่ฉันจะขยับตัวซึ่งฉันจะเรียกมันด้วย (int, int, float); เมื่อฉันโยนจำนวนเต็มไปยังจุดลอยตัวข้อผิดพลาดก็หายไป แต่สิ่งที่เกี่ยวข้องกับประเภทที่ไม่สมบูรณ์ฉันไม่รู้จริงๆ :)
Jamie Cook

9

หนึ่งในสิ่งที่ฉันใช้มากที่สุดไม่ได้อยู่ใน Boost ที่เหมาะสม แต่Adobe Source Libraries (ASL) ที่สร้างขึ้นบน Boost - โดยเฉพาะส่วนขยายของอัลกอริทึมมาตรฐานที่ยอมรับช่วง boost :: แทนตัวเริ่มต้น / สิ้นสุดตัววนซ้ำแยกกัน จากนั้นแทนที่จะโทรพูดว่า

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

ฉันสามารถพูดได้

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

(ฉันหวังว่าส่วนต่างๆของ ASL เหล่านี้จะย้ายไปที่ Boost ในที่สุด)


ฉันชอบมันฉันจะตรวจสอบ ASL
hamishmcn

8

ฉันใช้มาก:

  • เพิ่ม :: สัญญาณ
  • เพิ่ม :: shared_ptr
  • เพิ่ม :: lexical_cast
  • เพิ่ม :: ผูก
  • เพิ่ม :: สุ่ม
  • เพิ่ม :: ด้าย
  • เพิ่ม :: noncopyable

อื่น ๆ เช่น Tuple, Static Assert และ Integer มีประโยชน์มากหากคุณกำลังเขียนไลบรารีซึ่งจะต้องใช้กับแพลตฟอร์มที่หลากหลาย

สิ่งต่างๆเช่นกราฟและแลมบ์ดามีความเฉพาะเจาะจงมากขึ้น


โปรดอัปเดตสำหรับวันนี้ของ C ++ 11/14 (หรือพิจารณาลบคำตอบ)
einpoklum

8

boost::shared_ptrเป็นข้อกำหนดสำหรับการเขียนโปรแกรม C ++ สมัยใหม่ IMHO นั่นเป็นเหตุผลที่พวกเขาเพิ่มเข้าในมาตรฐานด้วย TR1 boost::program_options, boost::bindและboost::signalจะดีมากถ้าคุณรู้ว่าสิ่งที่พวกเขาหาและวิธีการใช้พวกเขา สองคนสุดท้ายมักจะสร้างความหวาดกลัวให้กับผู้มาใหม่


7

เราพบว่า boost :: spirit มีประโยชน์มากสำหรับโซลูชันทางธุรกิจในการแยกวิเคราะห์ ECMAScript ซับซ้อน แต่ดีมาก!



7

ฉันใช้ shared_ptr มาหลายปีแล้ว มันมีประโยชน์มากไม่มีเหตุผลที่โครงการควรจะไม่มีมัน

ยิ่งไปกว่านั้นฉันยังใช้ Bind / Function / Lambda สำหรับกลไกการโทรกลับทั่วไปซึ่งมีประโยชน์อย่างยิ่งเมื่อทำการทดสอบรวมถึงรูปแบบสำหรับการเปลี่ยน sprintf สำหรับวัตถุประสงค์ทั่วไปของฉัน

ในที่สุดมันก็เป็นเพียงวันอื่น ๆ ที่ฉันใช้ Variant ด้วยความโกรธเพื่อแก้ปัญหา (ตัวแยกวิเคราะห์ที่สามารถตอบสนองด้วยชุดโทเค็นที่ไม่เกี่ยวข้องขนาดเล็กและคงที่) วิธีแก้ปัญหานั้นสวยงามมากและฉันก็พอใจกับมันมาก


เวลาผ่านไปหลายปีและเวลาก็เปลี่ยนไปดังนั้นจึงมีเวลาสำหรับการอัปเดต ขณะนี้ SharedPtr และฟังก์ชันเป็นส่วนหนึ่งของมาตรฐานและ Bind และ Lambda ถูกยกเลิกโดยฟังก์ชันแลมด้าระดับภาษาจริง

ฉันยังคงใช้ Variant (ซึ่งได้รับการกำหนดมาตรฐานเช่นกัน แต่ฉันยังไม่ได้อยู่ที่นั่น) รูปแบบส่วนใหญ่ถูกแทนที่ด้วย fmtlib (ซึ่งได้รับการกำหนดมาตรฐานด้วย)

ส่วนใหญ่ของ Boost ที่ฉันใช้คือ Boost Asio ซึ่งอยู่ระหว่างการจัดทำมาตรฐาน.


1
ฉันเห็นด้วยกับสิ่งที่กล่าวมาทั้งหมดยกเว้นแลมด้า ฉันใช้มันมาระยะหนึ่งแล้ว แต่มันทรมานมากจนฉันละทิ้งมันไปเลย แต่เป็นสำนวนที่ง่ายที่สุด รอคอย C ++ 0x และรูปแบบของนิพจน์แลมบ์ดาอย่างใจจดใจจ่อ
Head Geek

ฉันยอมรับว่า Boost.Lambda เต็มไปด้วยข้อผิดพลาดทุกประเภท - ทันทีที่ฉันเข้าสู่อาณาจักรของ Unlambda หรือ Protect ฉันก็ยอมแพ้และทำแบบเก่า แต่ดูเหมือนว่าจำเป็นในการขยายการโทรกลับด้วยวิธีที่ดีเพียงครึ่งเดียว . ที่กล่าวว่าฉันก็รอการใช้งาน C ++ 0x เช่นกัน
Kaz Dragon

6

ใช้ tuples เพื่อวนซ้ำแผนที่เช่นนี้:

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

เมื่อใช้การกำหนดบูสต์ฉันสามารถเริ่มต้นแผนที่ได้ดังนี้:

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

และการใช้อะแดปเตอร์ช่วงและตัวดำเนินการไปป์ ("|") ฉันสามารถวนซ้ำไปข้างหลังค่าของแผนที่ (ดังตัวอย่าง):

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




3

ฉันชอบ boost :: random และ boost :: asio และ boost :: filesystem อย่างไรก็ตาม boost :: bind, boost :: circular_buffer และ boost :: thread นั้นใช้งานได้จริงตัวชี้สมาร์ทก็โอเค แต่ฉันชอบ RAII แทนในการจัดการหน่วยความจำ


6
ตัวชี้อัจฉริยะคือ RAII
Eclipse

4
อย่างแม่นยำยิ่งขึ้นตัวชี้อัจฉริยะจะให้ RAII แก่คุณเมื่อไม่มีทางเลือกอื่นนอกจากจัดสรรหน่วยความจำแบบไดนามิก
Branan

3

โอเคนี่คือสิ่งใหม่ที่ฉันพบ:
แทนที่จะใช้stricmpฉันสามารถใช้ฟังก์ชันเท่ากับของบูสต์และส่งผ่านในเพรดิเคต is_iequal
เช่น:
แทน

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

ฉันสามารถใช้

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

ได้รับ:

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

3

นี่คือสองเซ็นต์ของฉัน:

  • boost :: scope_exit - ไม่จำเป็นต้องกำหนดคลาส RAII สำหรับการใช้งานครั้งเดียว
  • เพิ่ม :: ใด ๆ
  • เพิ่ม :: ตัวแปร
  • เพิ่มไลบรารีคอนเทนเนอร์ตัวชี้ (ptr_vector)
  • ห้องสมุด Boost Pool
  • เพิ่ม :: 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 library?
gui libs เกือบทั้งหมดมีบางอย่างเช่น CString :: Format ("% i") หรือ QString :: Number ("% i") ซึ่งส่งคืนสตริงเริ่มต้น


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

หากคุณยินดีที่จะละทิ้งประเภทความปลอดภัยคุณสามารถม้วนของคุณเองด้วย vsnprintf (), จุดไข่ปลา (... ), va_list / stdarg.h และบัฟเฟอร์โลคัล (แบบเรียงซ้อน)
Mr.Ree

2
std :: string มี 71 ฟังก์ชันมากเกินไป (โดยจำนวน Herb Sutter ไม่ใช่ของฉัน) ดูgotw.ca/gotw/084.htmสำหรับรายละเอียด: ฉันคิดว่ามันมีข้อมูลเพียงพอที่จะอธิบาย (ก) ทำไมรูปแบบไม่จำเป็นต้องอยู่ใน std :: string และ (b) ทำไมการเขียนอัลกอริทึมทั่วไปจึงดีกว่าสมาชิกคลาส ฟังก์ชั่นต่อไป
Steve Jessop

4
หรือจะพูดอีกอย่างว่า "C ++ ก็เหมือนกับต่างประเทศ: พวกเขาทำสิ่งต่าง ๆ ที่นั่น" ;-)
Steve Jessop

1
รูปแบบไม่ใช่ส่วนหนึ่งของไลบรารีเนื่องจากความท้าทายอย่างหนึ่งที่ Stroustrup ถูกวางไว้ในขณะที่เขาออกแบบ C ++ คือการสร้างไลบรารี I / O ที่ฟอร์แมตแบบปลอดภัย เห็นได้ชัดว่าผลลัพธ์คือสิ่งที่คุณเห็นจาก iostreams เห็นได้ชัดว่าไม่มีใครคิดจะแก้ไขในเวลานั้น บางทีอาจมีคนอยากเขียนกระแสรูปแบบเพื่อให้นักอนุรักษนิยมรู้สึกเหมือนอยู่บ้านมากขึ้น?
Phil Miller

1

ฉันคิดว่าคำถามควรกลับกัน ส่วนไหนของคุณที่คุณไม่ต้องการใช้?

จากประสบการณ์ของฉันมันน่าสนใจและมีประโยชน์ในแต่ละโดเมนของปัญหา

คุณควรใช้เวลาค้นหาเอกสารการเพิ่มประสิทธิภาพเพื่อค้นหาพื้นที่ที่ครอบคลุมความสนใจของคุณ

ข้อยกเว้นประการหนึ่งอาจboost::numeric::ublasเป็นงานที่ทำได้ แต่Eigenทำได้ดีกว่าอย่างเห็นได้ชัด


ฉันสงสัยว่าหลายคนใช้ไลบรารี octonion
Petter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.