STL的缺陷

时间:2010-11-06 21:22:32

标签: c++ stl c++11 defects

虽然C ++标准库是非常通用且高效的库,但其界面的一些细节似乎令人失望。

  • 算法无法直接获取容器。 std::sort(myvec.begin(), myvec.end());代替std::sort(myvec);(我真的没有看到为什么从一开始就没有提供第二种形式的原因)

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

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

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

(当然这里的争论不是支持或反对通用编程,也不是关于一般设计问题。只是缺少重载,缺少算法版本,不方便的接口......)

2 个答案:

答案 0 :(得分:4)

  
      
  • 算法无法直接获取容器。 std :: sort(myvec.begin(),myvec.end());而不是std :: sort(myvec);
  •   

这个实际上是一个功能(它允许在C数组上循环),尽管正如GMan在评论中已经说过的那样,它可以得到改进。

  
      
  • 大多数服用字符串的函数成员需要const char *而不是const std :: string&
  •   

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

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

答案 1 :(得分:-6)

关于诸如sort之类的算法,只需根据需要定义包装器。

如果你不喜欢定义单个包装器,那么定义一个宏

#define ALL_OF( container ) startOf( container ), endOf( container )

使用合适的startOfendOf函数模板,这对原始数组和标准库容器都很有效。

即。你的第一个问题不是问题。

关于const char*个参数,它们通常不是string const&的问题。但是,如果标准库具有标准的低开销字符串载体并且使用了它,那将会很好。并且这是一个真正的问题,例如不支持宽字符串。文件流构造函数(Windows代码必须使用非标准扩展):对于执行环境,的正确程序不能仅使用标准库在标准C ++中表示。 / p>

当然,对于main来说,这是一个跨越核心语言和库的问题。