C++ 标准库有哪些问题?

2021-12-20 15:15发布

一些比较务实的缺陷:


C++ 20 和 C++ 17 的部分新东西(Ranges、pSTL) libc++ 基本没有实现,导致 Android、iOS、macOS 基本没法用这些东西(所以不要提 C++ 20、C++ 23 解决了下面的某些问题);


vector 里面判断东西有没有要 find(vec.begin(), vec.end(), v) != vec.end() 一是长(还不如写个 loop),二是很容易把后面那个 != vec.end() 手滑写成 vec2.end() 直接 UB(std::any_of 要传一个 pred,更恶心。。。)(其实不止 vector 有这个问题)


连个 FindIndex 都没有。。。

vector append 另一个 vector 还要 insert(vec.end(), vec2.begin(), vec2.end())


std::unordered_{map, set} 的性能是在搞笑


std::map 连个返回 optionalfind 都没有,例如想表达“如果有元素就用,没有就用默认值”。。呵呵(operator []会修改原来的 map,不在考虑之列)如果有 optional 返回的话,map.find(k).value_or(0) 这样就好


C++ 23 才有 string::containsstarts_withends_with。。。没有 contains 只能 find(str) != std::string::npos,而且我见过有人错写成 if (str.find("substr"))


C++ 23 终于有了一个凑合能用(但是依旧很难用,而且功能也是残的)的 string split, 然而依旧没有 string join、string trim

很多有用的容器都没有,例如 static_vectorRingQueue


到现在连个 ScopeGuard 都没有。。。(千万别跟我说用 shared_ptr 提代,我怕恶心)


variant 谁用谁死。


错误处理能整出来三四种(C errno、`from_chars` 返回一个结构体、filesystem 的 error_code 的 out ref、异常、std::cout 那种判断是不是为空再去拿错误的、etc.)


std::lerp 在游戏开发人员眼里已经成为了笑话