- 主题:我就觉得c++现在纯粹就是标准库不行
c++根本思路还是通用性、静态优先于动态从而零开销抽象那一套,所以很多能通过一点运行时开销解决的易用性痛点都搁置或者改用更繁琐的语法了。
为了不损失通用、静态、零开销抽象这些要求,还想易用,就需要更多语言基础设施,然后是库基础设施,最后才是应用库。加上兼容性问题,这个目标自然就费劲无比了。
比如lambda表达式出现之前通用算法就必然繁琐,但值语义且没有gc就必然带来变量捕获、对象生存期等一系列问题。于是还需要智能指针,这依赖右值引用和移动语义。这还带来 this 捕获、 enable_shared_from_this 之类别的语言没有的边角问题。
又比如可变长模板参数、tuple这条设计路线也比较晚,更不必说tuple的自动拆箱,充斥在关联容器里的愚蠢的pair的可读性就是噩梦。
也有设计问题,比如字符串实际上是连续的可变容器,和vector<char>功能过度重叠,功能少得可怜,却因为理论开销问题连 split 都不敢实现。早期面向迭代器的通用化思路让 range 那套太晚出现了,甚至 span 出现得也太晚了。——对强迫症来说理论上理想的string.split得到的应该是零开销的generator,这个基础设施到20都没完成;次一档的是返回string_view列表;像Qt那样直接返回一个串列表是绝对不会接受的。
map没有contains这种简单的api是不食人间烟火的典范。
【 在 libgcc 的大作中提到: 】
: 标准库一直残废几十年
:
: 直到c++20之前map连个contain都没有,string什么的就更别说了
: ...................
--
FROM 114.249.195.*
如果找不到返回nullptr其实还能忍,返回 verylongname.anothername.end() 你也能忍?
【 在 lambdai 的大作中提到: 】
: 哈哈哈
: 我会用个auto&& obj 获得find()的receiver…
:
: ...................
--
FROM 114.249.195.*
有 array 啊。
【 在 toutouqi (toutouqi) 的大作中提到: 】
: 见过一些人用vector替换指针,不reserve直接在循环里push_back赋值。感觉vector功能太多,应该另造一个array替代指针数组。
--
FROM 114.249.195.*
重来的话我估计可能会放宽 map 的约束允许 B 树的实现,这种影响时空开销的设计决策可能比 contains 这样的小 API 重要得多。不过也不好说,因为这意味着增删元素会造成迭代器失效,也需要权衡。
Rust 就是这样选择的,abseil 也有一套基于 B 树的关联容器。
【 在 lambdai (lambdai) 的大作中提到: 】
: 肯定的
: 不过multimap实在是太罕见了。我好像只在production上用过一次
: 不知道从头开始演化的话,是不是contains会优先级高于multimap
: ...................
--
FROM 114.249.195.*