c++ - STL的缺陷

标签 c++ stl c++11 defects

<分区>

虽然 C++ 标准库是非常通用和高效的库,但它们接口(interface)的一些小细节似乎令人失望。

  • 算法不能直接使用容器。 std::sort(myvec.begin(), myvec.end()); 而不是 std::sort(myvec); (我真的没有看到有效为什么不从一开始就提供第二种形式)

  • 大多数接受字符串的函数成员需要 const char * 而不是 const std::string&。 (C++字符串是std::string,至少应该有重载)

据我所知,这两个小缺陷应该在 c++0x 标准中得到纠正。

你能看出其他这些小缺陷吗?
您为什么认为这是一个缺陷?
有一天会被纠正吗?

(当然,这里的争论不是支持或反对泛型编程,实际上也不是关于一般设计问题。只是缺少重载、缺少算法版本、不方便的接口(interface)……)

最佳答案

  • Algorithms cannot take containers directly. std::sort(myvec.begin(), myvec.end()); instead of std::sort(myvec);

这实际上是一个特性(它允许在 C 数组上循环),尽管正如 GMan 在评论中所说的那样,它可以改进。

  • Most of function member taking string require const char * instead const std::string&

这是完全错误的,因为大多数 STL 函数都不是成员,它们中的大多数不是函数,而是函数模板,并且(几乎?)它们都不处理字符串独家。
(您可能在谈论文件流,它是标准库的一部分,但不是源自 STL 的标准库的那部分。当然,这是有原因的它们是采用 const char* 制作的,尽管这也可以改进。)

看来,正如许多批评 STL 的人一样,您对它的了解还不够多,无法做到这一点。这并不意味着没有什么可批评的。但是,就像在其他领域一样,在你开始做这件事之前,你至少应该知道为什么事情是这样的。

关于c++ - STL的缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4115234/

相关文章:

linux - 在双网卡 Linux 系统中对特定网卡执行连接

c++ - 模板类特化与函数重载

c++ - 在 Windows 上快速编译 Qt C++

c++ - 如何调用子类函数实现的纯虚基类方法?

c++ - 将对象指针保存在 STL 容器中而不是对象本身更好吗?

C++ 避免 vector <bool>实例化

c++ - std::unordered_(set|map) 基于范围的删除的真实用例是什么?

c++ - 混合调试和发布库/二进制文件 - 不好的做法?

c++ - 我想告诉 VC++ 编译器编译所有代码。可以吗?

c++ - vector 迭代器在深度复制 vector 时不兼容