转: 工作中用的C++库
转:https://www.mhftz.com/archives/42.html
个人学习C/C++的开源代码:
0.STL
1.osmium
2.leveldb
3.glog
4.redis
个人使用的开源代码:
1.rapidjson
2.protobuf
每个人每个时期都有所需要的lib,并且不同吧。
个人觉得3d方面HDK(houdini 3d, houdini engine)库是和其他库完全不同的:
HDK和其他库的区别就好像,其他库是初等数学,HDK是微积分。
这个库牛逼到:
比如你做一个舰船模型,只要修改一个参数(不是两个参数),这个舰船就能自动,智能的从渔船变成军舰,乃至变成宇宙飞船。每个模型都有无数级别,无数种变换。并且HDK在qt上可以和qt的python交互,使用很方便。
- 陈宇飞说道:
还是要推荐一下脸书的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之类的小库
- 慧航说道:
写几个我最经常用的吧:
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
不多解释了,两种不同类型的并行计算模型。
- 赵科进说道:
这就比较多了,有一些一直就很有名思想先进我也用过,比如Qt
还有一些比较老了,说出来有些倚老卖老,比如ATL,一个用于开发COM的模板库,还有MFC,WTL
另外还有一部分在自己的项目某些模块中使用了,一直如雷贯耳但是没太多的直接用到,比如boost,这玩意影响了C++的发展,你说它牛不牛?
还有opencv,华夏大地多少妹子爱它爱的不得了,虽然她们自己可能未必知道那些美颜,脸部识别多少都跟这玩意有些关系。
- 诸葛不亮说道:
越来越nb的STL,在尝试从Qt迁移中
直接影响cpp发展的,除了GUI等偏业务的,其他几乎啥都干的库,boost,目前在入门中
nb程度直追boost的folly,不过暂时没空学
Qt,同样是万能类库,同时还是强大的GUI库
大数字运算库GMP
计算机视觉库OpenCV,大学时玩过,不是一般的nb
- 知乎用户说道:
http客户端curl
http服务器 crow
gzip压缩zlib
json序列化jsoncpp
二进制序列化protobuf
嵌入式数据库sqlite
日志库glog
参数解析库gflags
消息队列zmq
rpc库brpc
tcp网络库evpp
3d仿真osg
图形图像opencv
stl,boost,qt就不用说了。
不是我说,大家老老实实做调包侠,赚钱才是王道。
windows下开发,强烈推荐vcpkg,了却找第三方库,编译第三方库的烦恼。
- Chen Moore说道:
愚以为STL已经应该算做C++的一部分了……
自己最常用的几个:
curl
zlib
sqlite
opencv - foruok说道:
- 应用开发框架Qt,我的最爱,我还写了两本相关的书,《Qt Quick核心编程》和《Qt on Android核心编程》。优雅的信号与槽,强大的界面类库,跨平台。
- CEF(Chromium Embedded Framework),使用网页做富客户端的绝佳选择,基于Chromium,可以方便嵌入到你的应用中。类似的还有 Electron 。
- WebRTC,非常赞的框架,做音视频通信绕不开的。
- TinyXml,小巧的C++ XML库,几个源文件,直接加入到项目中就可以用
- Protobuf,Google的,网络通信,非常赞,方便序列化和结构化,流量又小
- FreeImage,强大好用的图形库
- Libevent,轻量级的基于事件驱动的高性能的开源网络库
- ffmpeg,多媒体开发类库的无冕之王
- sunoru说道:
说几个跟化学相关的:
1. Open Babel,C++ 开发的,GPLv2。自由在几十种分子结构的文件格式之间转换,还带有简单的优化、绘图功能。虽然我觉得最好用的是它的 Python binding。
2. Gromacs,当前最流行的分子动力学模拟库,高性能,针对几乎所有平台都有优化。原本是 C 语言开发的,现在在向 C++ 迁移,已经完成大半了。是最好用的吗?按照我同事的话来讲就是“首先你要有个对手才可以比好不好用呀”。这个和 OpenBabel 一样,虽然本身也是一个软件,但作为 C++ 的库链接到你自己写的程序里会相当相当好用。对了,它还是 LGPL 开源的。
3. BALL Project,主体是 C++ 开发的,有少量 C 代码。它是一个主要为分子生物学和分子建模而生的工具库。有一个叫做 View 的扩展用来可视化结构文件很不错。提供类似功能的库其实有很多,比如 OpenMM 以及上面提到的那两个,不过我觉得 BALL 还是最全面健壮的,还支持扩展。最关键的,它也是 LGPL 协议开源的。
- Jaco说道:
- laike9m说道:
- 知乎用户说道:
来几个不常见但是很变态的库吧:
bundle: 把几乎所有常见的压缩库封装成了一个库, 接口完全统一, 想用哪个用哪个.
就一个h和一个巨TM大的cpp文件,巨好使巨方便.
Celero: 简单清晰的benchmark库, 特点就是简单易用没有废话.
getopt: 解析命令行输入参数的库, 好使! 没废话! 就俩文件.
stb_image: 常见图片格式加载库, 就一个巨大无比的头文件
stb_truetype: 常见字体加载库, 就一个巨大无比的头文件, 觉得freetype大的可以用它.
都在这: nothings/stb
better-enums: 编译期实现的enum扩展功能,包括enum和字符串互转等等. 感觉比较重量级, 我一般是不用的, 但有时候没它还真是别扭, 尤其是需要把一个enum序列化的时候.
Catch2: 著名的单元测试框架, 那么它和boost或者google的单元测试框架有什么不同呢?
就在于它首先是header only的, 其次是没有废话,直击要害! 你要测试对吧? 给你!
uchardet: 实现猜字符串编码的功能, 例如输入一个不知道编码的文本文件, 它可以帮你”猜” 这个文件的编码是什么. 和python里的uchardet功能基本一样.
win-iconv: iconv库是一个字符集编码转换的库, 在linux和mac下均是原生字符转换库. 但windows上并不是自带的. 那么就会导致在windows上编译iconv有点浪费. 因为windows显然已经自带字符集转换的功能了. 那么这个库的作用就是用windows api来实现和iconv库一模一样的接口. 这样编译出来比较小. 从此字符转换不是梦.
freetype-gl: open gl 上实现的freetype. 不过我个人没用过… 不知道好不好用. 但当你需要在opengl上下文中渲染字体的时候, 你可能用得着它.
nanovg: 基于openGL/DX/metal的2d绘图库. 绘图效率高, 接口清晰. 主版本是基于openGL的, 但有DX,metal等分支. 前端接口还有python和lua的. 个人感觉不错.
imgui: 大名鼎鼎的imgui, 你可能会问在有一堆GUI框架的情况下为什么我们需要imgui? 因为它是immediate mode的. 个人认为是几个immediate mode的GUI框架里最好的. 详细见它的页面介绍.
spdlog: logger库, 重点推荐! 为什么呢? 因为好使! 没有废话. 而且是header only的.
ffts: 很好使的FFT库, 和fftw的不同在于用着是真方便! 而且难能可贵在于速度居然真不比fftw慢.
fmt: formatting库, 又小又好使! 太好使了!
最后是恐怖的Amalgamate.
它是干嘛的呢? 它是专门用来把其他库”封装成”一个cpp和一个h文件的工具. 比如说freetype里有几十个h几十个cpp, 用起来觉得麻烦的话, 就写个配置文件然后用它跑一下, 立即就可以把freetype的这些cpp和h文件变成仅仅两个巨大无比的cpp和h文件. 再重复一遍, 巨大无比!! 这便是传说中的unity build…. 目前github上已经有很多的人开始用它来封装一些常见的库了.
那么这么做好不好呢, 我也不知道. 前文中提到的bundle库就是用它把N多库合并到一个cpp里的.
这个工具的作者vinniefalco还写了beast库, 目前已收录进了boost里.
freetypeAmalgam: 利用上面的工具把整个freetype封装成了一个h和一个cpp, 想用freetype又懒得编译和配置的人就把这两个文件往项目里一拖, 就可以用freetype了.
- 张友东说道:
做存储, 数据库系统方面的开发,主要用到
* grpc/libevent/libev/libasio 实现高性能网络服务器
* protobuf 数据结构序列化/反序列化,方便数据交换
* LevelDB/RocksDB 嵌入式KV数据库
* snappy/zlib/lz4 数据压缩,解压缩
* jemalloc/tcmalloc 高效内存分配器,尤其多线程场景
* jerasure Reed Solomon编解码,给存储系统实现erasure code
* murmurhash… 实现hash摘要
* crc32 数据存储或传输时的数据校验
* cJSON 解析json格式配置文件
* libBSON JSON序列化/反序列化,MongoDB使用这种格式存储数据
* boost 功能丰富的C++基础库,轻度使用,C++11/14后基本不用了。
* libRedis redis是一个数据库服务,并不是单独的库,但其代码精简,质量非常高,里面很多代码都可以拿出来直接复用,比如网络,各种数据结构的实现。 - Irons Du说道:
我推荐一个貌似没被提及的:https://github.com/Taywee/args。
用于解析命令行参数,个人觉得比gflags高级多了。
- Xi Yang说道:
我来布道GNU的那一套吧。
Glib:C基础库,提供了容器、原子操作、线程、抛异常、字符串等基础设施。
GObject:在C里面实现比C++更彻底的对象系统。Gtk3的GObject有很彻底的introspection能力,比如运行时自动生成脚本语言绑定。代价是写类型需要一堆恶心的宏。
Cairo:2D绘图库,功能全面,支持多种绘图表面,包括内存位图、矢量文件(PDF、PostScript、SVG)、窗口表面。主要问题是在Windows上的屏幕绘图是用GDI实现的,神特么慢。
Gtk:GUI开发架构。它几乎所有的玩意都可以绑事件,事件化的程度比Qt Widgets还要彻底。Gtk Builder使用布局描述XML在运行时构建GUI,并且自动绑定回调函数(代价是必须暴露回调函数到符号表)。基于GObject既是它的好处(彻底的事件化),也是它的缺点(写个新Gtk类型需要一堆恶心的宏)。
- zpan说道:
GLib
FFmpeg
fftw
boost
Catch2
libuv
http_parser
OpenSSL
libsodium
MsgPack
cblas
SQLite
Redis
cJSON
- 知乎用户说道:
说几个不是库的
OpenAFS,著名的分布式文件系统。
Memcached,没人不知道吧
https://github.com/goossaert/hashmap hashmap
http://thrust.github.io 这是个并行库
opencl不用我说了吧。
openmp也不用说吧
leveldb rocksdb
memtrack 一看名字就知道干啥吧。
cppcheck静态检查的
addressantizer valgrind 查内存泄漏的
ace是垃圾,我不用它。
v8 js引擎
crow cpp版的flask,web框架
peloton数据库,Self-Driving DB
转: 工作中用的C++库的更多相关文章
- Liu Junqiao:工作中用到的命令以及问题汇总
工作中用到的命令以及问题汇总 2019-11-29 查看系统运行时间,这个问题是因为我们在阿里云上有个机器,在某一天发现这台机器上有的服务莫名奇妙的停了,然后排查时怀疑机器被重启过用如下如下命令查看了 ...
- 工作中用到的linux命令
都是工作中用到的,解决问题至上,不求甚解,怕再忘了,所以记录一下,勿喷. .log |,,,,|,| 先说一下这条命令: cat:打印文件内容 grep:查找,用到的有\s匹配空白字符 sed:刚用到 ...
- linux下查看动态链接库依赖关系的命令 x86: ldd *.so arm: arm-linux-readelf -d *.so 实际例子: 以项目中用到的库librtsp.so分析: lijun@ubuntu:~/workspace$ arm-hisiv100nptl-linux-ld -d librtsp.so arm-hisiv100nptl-linux-ld:
linux下查看动态链接库依赖关系的命令 x86:ldd *.so arm:arm-linux-readelf -d *.so 实际例子:以项目中用到的库librtsp.so分析:l ...
- ESP8266开发之旅 网络篇② ESP8266 工作模式与ESP8266WiFi库
在网络篇①中,博主主要讲解了Arduino上开发ESP8266的插件库 Arduino Core For ESP8266.但是,并没有讲到关于这个模块的工作模式,所以本篇讲着重讲解ESP826 ...
- 记录工作中用到的linux命令
日常工作中会对centos进行操作,总是会有一些常用的命令记不住,特开一贴,记录那些命令,学而时习之. RPM操作类命令: 查看RPM安装路径: 1.rpm -qa|grep Memcache ...
- 工作中用Git对项目进行管理
前言 之前一直是用svn来管理代码的,今天第一次用git来管理代码,从安装.上传代码过程中遇到了很多问题,Github中建的repository之前还是https协议,最后不知道怎么又变成了git协议 ...
- 工作中用到和应该知道的eclipse快捷键
Eclipse最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会(Ecl ...
- 最近工作中用到的Linux指定 PS Kill netstat解释
1.ps详解点击如下链接 https://jingyan.baidu.com/article/fec4bce2479f05f2618d8b80.html 2.kill kill命令用来删除执行中的程序 ...
- 工作中用到的oracle字符串分割整理
oracle部分: 定义类型(用于字符串分割): create or replace TYPE "STR_SPLIT" IS TABLE OF VARCHAR2 (4000); 字 ...
随机推荐
- Nginx基础优化
Nginx基础优化 1.隐藏nginx header版本号 1.1查看版本号 [root@Nginx ~]# curl -I http://www.yunwei.cn HTTP/1.1 200 OK ...
- Numpy_key_point
Numpy使用中的一些注意点: ------------------------------------------------------------------------------------ ...
- codeforces 1182E Product Oriented Recurrence 矩阵快速幂
题意:设f(n) = c ^ (2n - 6) * f(n - 1) * f(n - 2) * f(n - 3), 问第n项是多少? 思路:官方题解:我们先转化一下,令g(x) = c ^ x * ...
- 【TJOI/HEOI2016】求和
题面 题目分析 \[ \begin{split} \sum_{i=0}^n\sum_{j=0}^iS(i,j)\cdot 2^j\cdot j!&=\sum_{j=0}^n2^j\cdot j ...
- Map集合类(二.其他map集合jdk1.8)
java集合笔记一 java集合笔记二 java集合笔记三 1.hashtable(线程安全) 1.存储数据为数组+链表2.存储键值对或获取时通过hash值取模数组长度确定节点在数组中的下标位置 in ...
- Delphi 堆栈 [ heap(堆) 和 stack(栈) ]
程序需要的内存空间分为 heap(堆) 和 stack(栈); heap(堆) 是自由存储区, stack(栈) 是自动存储区; 使用 heap 需要手动申请.手动释放, 使用 stack 是自动申请 ...
- sql 聚合查询
如果我们要统计一张表的数据量,例如,想查询students表一共有多少条记录,难道必须用SELECT * FROM students查出来然后再数一数有多少行吗? 这个方法当然可以,但是比较弱智.对于 ...
- Android 在OnCreate()中获取控件高度与宽度
试过在OnCreate()中获取控件高度与宽度的童鞋都知道,getWidth()与getHeight()方法返回是0,具体原因 看一下Activity的生命周期 就会明白. 上代码: 方法一: int ...
- NX二次开发-Block UI C++界面Specify Point(指定点)控件的获取(持续补充)
Specify Point(指定点)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); / ...
- 一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?布隆过滤器
何为布隆过滤器 还是以上面的例子为例: 判断逻辑: 多次哈希: Guava的BloomFilter 创建BloomFilter 最终还是调用: 使用: 算法特点 使用场景 假设遇到这样一个问题:一个网 ...