你工作中最推薦的 C/C++ 程序庫有哪些,為什麼?


寫幾個我最經常用的吧:

1、科學家算GSL:GNU Scientific Library

基本上能滿足用C做科學計算的要求:

The complete range of subject areas covered by the library includes,

Complex NumbersRoots of PolynomialsSpecial FunctionsVectors and MatricesPermutationsSortingBLAS SupportLinear AlgebraEigensystemsFast Fourier TransformsQuadratureRandom NumbersQuasi-Random SequencesRandom DistributionsStatisticsHistogramsN-TuplesMonte Carlo IntegrationSimulated AnnealingDifferential EquationsInterpolationNumerical DifferentiationChebyshev ApproximationSeries AccelerationDiscrete Hankel TransformsRoot-FindingMinimizationLeast-Squares FittingPhysical ConstantsIEEE Floating-PointDiscrete Wavelet TransformsBasis splinesRunning StatisticsSparse Matrices and Linear Algebra

從最優化 到 排序 到 線性代數、稀疏矩陣,功能是很全的。

當然,有條件的可以用Intel的MKL:https://software.intel.com/en-us/intel-mkl/

2、最優化工具包,NLopt:NLopt Reference

一般簡單問題GSL的最優化包也夠用了,不過如果碰到有約束之類的問題,NLopt包是個不錯的選擇。

3、OpenMP、OpenMPI

不多解釋了,兩種不同類型的並行計算模型。


還是要推薦一下臉書的folly,畢竟廣告還是要打的 GitHub - facebook/folly: An open-source C++ library developed and used at Facebook.

folly就是一個雜貨鋪,裡面很多boost沒有的東西。我最常用到的就是folly::to,雖然新標準裡面都有這種數字/字元串的轉換了,但是老版本編譯器的話還是folly::to 方便

folly還有各種各樣的數據結構,比如MPMCQueue是一個多Consumer多Producer的queue,用起來非常方便,速度也快。AtomicList,AtomicUnorderedMap,AtomicStruct都是一個在高並發的情況下需要用到的數據結構

如果你對裡面的內部構造感興趣,我寫過一個關於folly裡面各種數據結構的問,你可以看看你見過哪些令你瞠目結舌的C/C++代碼技巧? - 陳宇飛的回答


泛用庫Boost,界面庫Qt,通信庫ZeroMQ,視覺庫OpenCV,並發庫tbb,深度學習Caffe,序列化Protobuf ,加上一些cppformat之類的小庫


愚以為STL已經應該算做C++的一部分了……

自己最常用的幾個:

curl

zlib

sqlite

opencv


  1. 應用開發框架Qt,我的最愛,我還寫了兩本相關的書,《Qt Quick核心編程》和《Qt on Android核心編程》。優雅的信號與槽,強大的界面類庫,跨平台。

  2. CEF(Chromium Embedded Framework),使用網頁做富客戶端的絕佳選擇,基於Chromium,可以方便嵌入到你的應用中。

  3. WebRTC,非常贊的框架,做音視頻通信繞不開的。
  4. TinyXml,小巧的C++ XML庫,幾個源文件,直接加入到項目中就可以用
  5. Protobuf,Google的,網路通信,非常贊,方便序列化和結構化,流量又小
  6. FreeImage,強大好用的圖形庫


越來越nb的STL,在嘗試從Qt遷移中

直接影響cpp發展的,除了GUI等偏業務的,其他幾乎啥都乾的庫,boost,目前在入門中

nb程度直追boost的folly,不過暫時沒空學

Qt,同樣是萬能類庫,同時還是強大的GUI庫

大數字運算庫GMP

計算機視覺庫OpenCV,大學時玩過,不是一般的nb


說幾個跟化學相關的:

1. Open Babel,C++ 開發的,GPLv2。自由在幾十種分子結構的文件格式之間轉換,還帶有簡單的優化、繪圖功能。雖然我覺得最好用的是它的 Python binding。

2. Gromacs,當前最流行的分子動力學模擬庫,高性能,針對幾乎所有平台都有優化。原本是 C 語言開發的,現在在向 C++ 遷移,已經完成大半了。是最好用的嗎?按照我同事的話來講就是「首先你要有個對手才可以比好不好用呀」。這個和 OpenBabel 一樣,雖然本身也是一個軟體,但作為 C++ 的庫鏈接到你自己寫的程序里會相當相當好用。對了,它還是 LGPL 開源的。

3. BALL Project,主體是 C++ 開發的,有少量 C 代碼。它是一個主要為分子生物學和分子建模而生的工具庫。有一個叫做 View 的擴展用來可視化結構文件很不錯。提供類似功能的庫其實有很多,比如 OpenMM 以及上面提到的那兩個,不過我覺得 BALL 還是最全面健壯的,還支持擴展。最關鍵的,它也是 LGPL 協議開源的。


每個人每個時期都有所需要的lib,並且不同吧。

個人覺得3d方面HDK(houdini 3d, houdini engine)庫是和其他庫完全不同的:

HDK和其他庫的區別就好像,其他庫是初等數學,HDK是微積分。

這個庫牛逼到:

比如你做一個艦船模型,只要修改一個參數(不是兩個參數),這個艦船就能自動,智能的從漁船變成軍艦,乃至變成宇宙飛船。每個模型都有無數級別,無數種變換。

並且HDK在qt上可以和qt的python交互,使用很方便。


按需要來啊!加第三方庫是有維護成本的啊,加不加都是需要考慮的.

我現在喜歡的庫就只有boost


RapidJSON: 首頁

這個json處理工具性能優良。這個是已經在工作中使用過的。

在推薦一個工作中沒有使用,但是非常不錯的開源項目,值得你學習: Seastar


boost,裡面很多庫c++用得很精妙,但是不推薦直接用,太大了。

libuv,代碼寫得很漂亮

其他的我接觸的那些都一般性,不如自己寫


這就比較多了,有一些一直就很有名思想先進我也用過,比如Qt

還有一些比較老了,說出來有些倚老賣老,比如ATL,一個用於開發COM的模板庫,還有MFC,WTL

另外還有一部分在自己的項目某些模塊中使用了,一直如雷貫耳但是沒太多的直接用到,比如boost,這玩意影響了C++的發展,你說它牛不牛?

還有opencv,華夏大地多少妹子愛它愛的不得了,雖然她們自己可能未必知道那些美顏,臉部識別多少都跟這玩意有些關係。


在地理信息系統(Geographic information system)和地圖製圖領域,常用的開源庫是GDAL: GDAL - Geospatial Data Abstraction Library, 與GEOS和PROJ.4一起配合,在GIS和地圖製圖領域軟體中使用非常廣泛。

GDAL 一個開源地理數據抽象庫,提供非常豐富的地理數據讀寫驅動;

GEOS 一個開源幾何引擎, 提供幾何模型、幾何關係判斷、基本幾何計算操作等功能;

PROJ4 一個開源地圖投影庫,提供豐富的地圖投影轉換演算法。


永遠第一:libc++和libstdc++,然後可以是boost,但這幾年這東西掉價


1. I/O框架庫libevent

2. 二進位序列化庫protobuf

3. boost庫的asio和shared_ptr(不過後者已經在C++11里包括了)

4. 日誌系統Log4cXX

5. XML解析庫tinyXML

6. json解析庫jsoncpp

7. 小巧的關係型資料庫SQLite

8. key-value的Redis

9. 計算機視覺庫opencv

10. 數學公式解析庫muparserX系列

11. google的kv資料庫leveldb,源碼很適合學習

12. 可以做深度學習封裝了socket封裝了pthread等一大堆功能的dlib,很爽。

13. 深度學習庫caffe,現在想到的就有這些,以後補充。。。


htrp客戶端curl,壓縮zlib,json序列化jsoncpp,二進位序列化protobuf,嵌入式資料庫sqlite,3d模擬osg,圖形圖像opencv,stl,boost,qt就不用說了。


基本上現在所有的c++庫都是垃圾,包括stl,boost在內,所以沒什麼好推薦。當然,特定領域下,還是將就可以用用的,比如,界面就用qt,噁心就噁心,能完成工作就好。人臉識別用opencv,……


除了stl和boost, Google的庫大都很好用,gtest, glog, gflags, protobuf, grpc

最推薦的是protobuf


Chromium base


我會推薦一些輕量級的庫,類似tinyxml, tinydnn之類的,最好是header only的。

c/c++裝依賴庫簡直累覺不愛,各種麻煩,尤其是需要跨平台的時候,簡直想屎!


推薦閱讀:

ACM 怎麼樣零基礎到入門?
現在 C 語言可以設計 FPGA 么?
pthread_cond_wait 為什麼需要傳遞 mutex 參數?
在哪裡可以找到C語言標準庫的實現源代碼?
為什麼知乎用戶vczh不建議初學編程的人把C作為入門語言?

TAG:編程 | C編程語言 | 計算機網路 | C |