Các phần được sử dụng nhiều nhất của Boost [đã đóng]


115

Khi tôi phát hiện ra boost::lexical_casttôi đã nghĩ "tại sao tôi không biết về điều này sớm hơn!" - Tôi ghét phải viết mã như

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

Bây giờ tôi viết

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

Hôm qua, trên stackoverflow, tôi đã xem qua boost split (một loại đá quý khác sẽ giúp tôi tiết kiệm mã viết).

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

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

Tôi sẽ bắt đầu xem qua tài liệu tăng cường tìm kiếm các chức năng khác mà tôi sẽ có thể sử dụng thường xuyên, nhưng tôi cảm thấy rằng nó sẽ rất dễ bỏ lỡ mọi thứ.

Những chức năng tăng nào bạn sử dụng nhiều nhất / ghét không có?


1
Không quan tâm, điều gì đã ngăn bạn viết chức năng "chuyển đổi số thành chuỗi" của riêng mình trước khi bạn sử dụng Boost? Tôi đã thấy sự trùng lặp và viết một mẫu đơn giản và sử dụng nó và sau đó, có lẽ, đã chuyển sang phiên bản boost khi tôi tìm thấy nó ...
Len Holgate

4
Xin chào Len, vào những thời điểm khác nhau trên các dự án khác nhau, tôi đã viết một hàm "ToStr", nhưng sau đó tôi sẽ chuyển sang một dự án khác, sau đó kết thúc việc viết 3-liner vì tôi chỉ muốn thực hiện công việc ngu ngốc: - ) trái ngược với chi phí tạo tập tin "misc_funcs"
hamishmcn

Câu trả lời:


62

Có lẽ phần được sử dụng nhiều nhất cho boostboost :: shared_ptr .


13
Cũng có thể sử dụng nhiều nhất. Tôi đã tự học bài học một cách khó khăn bằng cách phải cấu trúc lại hầu hết các cách sử dụng shared_ptr bằng các tham chiếu, các thùng chứa con trỏ và auto_ptr. Bây giờ tôi hầu hết đồng ý với điều này: bureau14.fr/blogea/index.php/2009/08/ Khăn
amit

1
@phaedrus: Liên kết cập nhật: blogea.bureau14.fr/index.php/2009/08/ trên
MatthewD

4
Không còn liên quan trong C ++ 11 có std::shared_ptrstd::unique_ptr.
einpoklum

49

BOOST_FOREACH làm cho cuộc sống trở nên đáng giá một lần nữa.

(Tại sao không ai đề cập đến điều này? Câu hỏi đã được hỏi 8 tháng trước!)


15
Bài viết của Eric Niebler's về "Tình yêu có điều kiện" ( artima.com/cppsource/foreach.html ) mô tả cách BOOST_FOREACH hoạt động. Thật là điên rồ.
Jeff Hardy

2
Không còn quá phổ biến với C ++ 11 và lambdas ...
einpoklum

34

Faves của tôi là, không theo thứ tự cụ thể:

  • regex
  • hệ thống tập tin
  • chủ đề
  • từ vựng
  • chương trình_options (chỉ xuất sắc!)
  • kiểm tra (cho tất cả các nhu cầu kiểm tra đơn vị của tôi).
  • Thuật toán chuỗi
  • Chuỗi mã thông báo
  • định dạng (định dạng chuỗi kiểu printf an toàn)
  • ptrs thông minh

Boost là một sự trợ giúp lớn khi tôi viết ứng dụng đa nền tảng đầu tiên của mình - nếu không có nó, tôi thực sự sẽ phải vật lộn.


4
Vui lòng cập nhật cho C ++ 11 / C ++ 14 ...
einpoklum

28

Tôi thích cách bạn có thể cung cấp công cụ hủy diệt của riêng bạn cho shared_ptr.
Điều này có nghĩa là, ví dụ, bạn có thể sử dụng nó với FILE*và lấy nó để đóng tệp cho bạn.
ví dụ

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
Tôi biết rằng gần hai năm sau, nhưng ... việc gán đó NULLlà vô ích, vì nó gán tham số chức năng cục bộ. :)
Xeo

1
Cảm ơn @Xeo, tôi đã gỡ bỏ nó
hamishmcn

22

Không có ai đề cập đến Container đa chỉ số nên tôi sẽ gọi điện muộn. Không phải là bạn thường xuyên cần chúng, nhưng không tăng cường, đó là một nỗi đau thực sự để tạo ra một cấu trúc dữ liệu tương đương, cũng như kém hiệu quả hơn. Gần đây tôi đã sử dụng chúng rất nhiều để tạo ra các container tìm kiếm trên 2 phím.


20

Tôi ngạc nhiên khi không ai nhắc đến boost::optional. Tôi thấy mình sử dụng nó thường xuyên hơn bất kỳ phần nào của Boost ngoại trừ shared_ptrscoped_ptr.


1
Bây giờ có sẵn std::experimental::optionalvà sớm (C ++ 17?) Như std::optional.
einpoklum

1
Yup, và tôi rất vui vì điều đó. :-) Mặc dù xem xét sự chậm trễ giữa các tiêu chuẩn và việc thực hiện đầy đủ chúng trong tất cả các trình biên dịch tôi sử dụng, vẫn sẽ mất một lúc trước khi tôi có thể phụ thuộc vào nó ... Tôi chỉ có thể bắt đầu sử dụng C ++ 11 trên một dự án vào năm ngoái. :-(
Head Geek

Trên thực tế tôi nghĩ rằng hầu hết các trình biên dịch đều đạt tiêu chuẩn đáp ứng wrt trong những năm gần đây - GCC và clang hỗ trợ C ++ 14 khi nó được phát hành, phải không? Dù sao, hãy xem xét việc tích hợp nhận xét của bạn vào câu trả lời của bạn.
einpoklum

@HeadGeek Thật thú vị khi thấy một bình luận mới được thêm vào câu trả lời của bạn sau 8 năm, và bạn đã trả lời!
Đức Thanh

Wow ... tôi đoán nó đã được tám năm. Như chú ếch Kermit nói, thời gian thật thú vị khi bạn có ruồi. ;-)
Head Geek

19

Không ai đề cập đến tăng :: tuple? Vì xấu hổ!


2
Bây giờ có sẵn như std::tuple.
Dmitri Nesteruk

11

BOOST_STATIC_ASSERT

Cập nhật (tháng 10 năm 2011): C ++ 11 (C ++ 0x) có static_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert


5
BOOST_MPL_ASSERT_MSG cho phép rất dễ đọc / phát hiện các lỗi có nhiều thông tin hơn so với thông báo loại không đầy đủ sizeof mà BOOST_STATIC_ASSERT đưa ra.
KitsuneYMG

ở đây ở đây! Tôi chỉ tìm thấy một trong những lỗi loại không hoàn chỉnh bên trong macro thử nghiệm BOOST_CHECK_CLOSE - tôi mất nửa ngày để tìm hiểu điều gì đang xảy ra trước khi tôi xoay vòng mà tôi đã gọi nó bằng (int, int, float); một khi tôi bỏ các số nguyên đến dấu phẩy động thì lỗi sẽ biến mất. Nhưng những gì phải làm với một loại không hoàn chỉnh tôi thực sự không biết :)
Jamie Cook

9

Một trong những ứng dụng được sử dụng nhiều nhất của tôi không phải là Boost thích hợp, mà là Thư viện nguồn Adobe (ASL) được xây dựng dựa trên Boost - cụ thể là các phần mở rộng cho các thuật toán tiêu chuẩn chấp nhận phạm vi boost :: thay cho các trình lặp bắt đầu / kết thúc riêng biệt. Sau đó, thay vì gọi, nói,

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

Tôi chỉ có thể nói

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

(Tôi thực sự hy vọng những phần này của ASL sẽ chuyển sang Boost.)


Tôi thích nó, tôi sẽ kiểm tra ASL
hamishmcn

8

Tôi sử dụng rất nhiều:

  • tăng :: tín hiệu
  • boost :: shared_ptr
  • boost :: lexical_cast
  • tăng :: liên kết
  • tăng :: ngẫu nhiên
  • tăng :: chủ đề
  • boost :: không thể quét

Khác như Tuple, Tĩnh Assert và Integer rất hữu ích nếu bạn đang viết thư viện do được sử dụng trên nhiều nền tảng khác nhau.

Những thứ như Đồ thị và Lambda cụ thể hơn.


Vui lòng cập nhật cho những ngày này của C ++ 11/14 (hoặc xem xét xóa câu trả lời).
einpoklum

8

boost::shared_ptrlà một yêu cầu cho IMHO lập trình C ++ hiện đại. Đó là lý do tại sao họ đã thêm nó vào tiêu chuẩn với TR1. boost::program_options, boost::bindboost::signalthực sự tốt đẹp nếu bạn biết chúng dùng để làm gì và sử dụng chúng như thế nào. Hai người cuối cùng có xu hướng sợ người mới.


7

Chúng tôi thấy boost :: Spirit khá hữu ích cho một giải pháp kinh doanh để phân tích ECMAScript. Phức tạp, nhưng rất đẹp!



7

Tôi đã sử dụng shared_ptr trong nhiều năm nay. Nó rất hữu ích, không có lý do gì mà một dự án nên không có nó.

Trên hết, tôi cũng sử dụng Bind / Function / Lambda cho các cơ chế gọi lại chung - đặc biệt hữu ích khi thử nghiệm - cũng như Định dạng cho thay thế chạy nước rút cho mục đích chung của tôi.

Cuối cùng, đó chỉ là một ngày khác khi tôi sử dụng Biến thể trong sự tức giận để giải quyết vấn đề (một trình phân tích cú pháp có thể phản hồi với một tập hợp nhỏ các loại mã thông báo không liên quan cố định). Giải pháp rất thanh lịch và tôi rất hài lòng với nó.


Nhiều năm đã trôi qua và thời gian đã thay đổi, vì vậy thời gian để cập nhật. SharedPtr và Function hiện là một phần của Standard và Bind và Lambda bị lỗi thời bởi chức năng lambda ở cấp độ ngôn ngữ thực tế.

Tôi vẫn sử dụng Biến thể (cũng đã được chuẩn hóa, nhưng tôi chưa có), Định dạng phần lớn được thay thế bằng fmtlib (cũng đã được chuẩn hóa).

Phần lớn của Boost mà tôi sử dụng là Boost.Asio. Đó là trong quá trình được tiêu chuẩn hóa.


1
Tôi đồng ý với tất cả những điều trên - ngoại trừ Lambda. Tôi đã sử dụng nó trong một thời gian, nhưng nó quanh co đến nỗi tôi đã từ bỏ nó vì tất cả những biểu hiện đơn giản nhất. Háo hức chờ đợi C ++ 0x và hình thức biểu thức lambda của nó.
Head Geek

Tôi đồng ý rằng Boost.Lambda có đầy đủ các loại cạm bẫy - ngay khi tôi bước vào vương quốc của Unlambda hoặc Protect, tôi từ bỏ và làm theo cách cũ, nhưng có vẻ cần thiết trong việc mở rộng các cuộc gọi lại theo bất kỳ cách nào nửa vời . Điều đó nói rằng, tôi cũng đang chờ triển khai C ++ 0x.
Kaz Dragon

6

Sử dụng bộ dữ liệu để lặp lại bản đồ, như thế này:

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

Sử dụng boost gán, tôi có thể xác định bản đồ như thế này:

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

Và bằng cách sử dụng bộ điều hợp phạm vi và toán tử đường ống ("|"), tôi có thể lặp lại các giá trị của bản đồ (làm ví dụ):

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

1
Điều đó thật tuyệt. Nó đã cho tôi đọc qua tài liệu về bài tập tăng cường: boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn


5

Tôi sử dụng Bộ chứa Con trỏ Tăng cường theo sở thích cho bộ chứa STL của shared_ptrs.



3

Tôi thích boost :: Random và boost :: asio và boost :: filesystem, tuy nhiên boost :: bind, boost :: circle_buffer và boost :: thread rất thực tế, con trỏ thông minh vẫn ổn nhưng tôi thích RAII hơn là quản lý bộ nhớ


6
Con trỏ thông minh là RAII.
Nhật thực

4
chính xác hơn, Con trỏ thông minh cung cấp cho bạn RAII khi không có lựa chọn nào khác ngoài việc phân bổ bộ nhớ một cách linh hoạt.
Branan

3

Được rồi, đây là một cái mới tôi đã tìm thấy:
Thay vì sử dụng stricmp, tôi có thể sử dụng hàm bằng của boost và chuyển vào vị từ is_iequal,
ví dụ:
thay vì

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

tôi có thể sử dụng

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

được:

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

3

Đây là hai xu của tôi:

  • boost :: scope_exit - không cần xác định lớp RAII chỉ cho một lần sử dụng
  • tăng :: bất kỳ
  • boost :: biến thể
  • Thư viện chứa con trỏ Boost (ptr_vector)
  • Thư viện hồ bơi Boost
  • boost :: unordered_map / boost :: unordered_set

3

Tôi sử dụng boost::iclkhá nhiều cho xử lý hậu kỳ văn bản. Tiết kiệm cho tôi khá nhiều thời gian vì nếu không tôi sẽ phải tự thực hiện phân tách văn bản ...

BOOST_FOREACH có ở khắp mọi nơi trong mã của tôi :)

boost::functionboost::bindlà một phải tuyệt đối. Mặc dù bây giờ họ đang std::functionstd::bind. Chúng thực sự giúp giảm số lượng mã không cần thiết và thường chỉ tốt cho các thiết kế của tôi (hoặc ảo tưởng của tôi).

Gần đây tôi đã bắt đầu sử dụng boost::interprocess::message_queuevà đây cũng là một công cụ tuyệt vời.

Tôi sẽ sử dụng nhiều hơn nữa, nhưng Qt có những cách riêng để làm rất nhiều việc mà Boost làm. Nếu tôi phải lập trình C ++ thuần túy, tôi đoán tôi sẽ trở thành một boost::junkie:)


3

Những gì tôi sử dụng nhiều nhất hiện có sẵn trong TR1:

  • con trỏ chia sẻ
  • lớp mảng

Bây giờ tôi cũng sử dụng các lớp pool và một số thứ cụ thể khác.

Bây giờ bạn đã hiểu rằng Boost có nghĩa là hữu ích cho hầu hết các lập trình viên, đó là lý do tại sao nó là giường thử nghiệm cho thư viện tiêu chuẩn trong tương lai.


1

Nói về boost :: lexical_cast, tại sao không phải là 'định dạng' một thành viên tĩnh trong thư viện std :: string?
Hầu hết tất cả các gui lib đều có một cái gì đó như CString :: Format ("% i") hoặc QString :: Number ("% i") trả về một chuỗi khởi tạo.


4
ví dụ: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
Cướp

Nếu bạn sẵn sàng từ bỏ loại an toàn, bạn có thể tự cuộn với vsnprintf (), ellipsis (...), va_list / stdarg.h và bộ đệm cục bộ (dựa trên ngăn xếp).
Mr.Ree

2
std :: chuỗi đã có 71 hàm quá nhiều (theo số đếm của Herb Sutter, không phải của tôi). Xem gotw.ca/gotw/084.htm để biết chi tiết: Tôi nghĩ rằng nó có đủ thông tin để giải thích (a) tại sao định dạng không cần phải có trong std :: string và (b) tại sao nên viết thuật toán chung hơn thành viên lớp chức năng nào.
Steve Jessop

4
Hay nói cách khác, "C ++ giống như một quốc gia nước ngoài: họ làm những điều khác biệt ở đó" ;-)
Steve Jessop

1
Định dạng không phải là một phần của thư viện vì một trong những thách thức mà Stroustrup đặt ra khi anh ta thiết kế C ++ là xây dựng thư viện I / O được định dạng an toàn. Rõ ràng, kết quả là những gì bạn thấy với iostreams. Rõ ràng, không ai nghĩ đến việc nội suy vào thời điểm đó. Có lẽ ai đó muốn viết một định dạng, để làm cho những người theo chủ nghĩa truyền thống cảm thấy như ở nhà hơn?
Phil Miller

1

Tôi nghĩ rằng câu hỏi nên được đảo ngược. Phần nào trong số bạn tăng bạn sẽ không muốn sử dụng?

Theo kinh nghiệm của tôi, hầu hết tất cả đều thú vị và hữu ích trong từng miền vấn đề.

Bạn nên dành thời gian tìm kiếm tất cả các tài liệu quảng cáo để tìm ra các lĩnh vực phù hợp với sở thích của bạn.

Một ngoại lệ có thể boost::numeric::ublaslà công việc của nó, nhưng Eigen làm nó tốt hơn đáng kể.


Tôi nghi ngờ thư viện octonion được sử dụng bởi nhiều người.
Petter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.