原始STL与最终进入C+的部分之间的具体区别是什么+;标准图书馆? 我想知道STL发布的与ISO C++标准库之间的具体区别是什么。由提示而不是完全由回答

原始STL与最终进入C+的部分之间的具体区别是什么+;标准图书馆? 我想知道STL发布的与ISO C++标准库之间的具体区别是什么。由提示而不是完全由回答,c++,stl,C++,Stl,一些差异是显而易见的,例如slist和hash\u集类从未被纳入标准。我也在寻找更细微的差异,例如方法的返回值/参数差异,或不同的复杂性要求,或不同的迭代器无效条件。除了: std::basic_string配备了STL容器接口 一些模板特性被添加到语言中以更好地支持STL,标准库的STL部分可以利用这些特性,但原始STL无法使用 SGI STL在C++标准中的“缺失”包括 slist 哈希集,哈希映射,哈希多集,哈希多映射以及与哈希函数相关的所有内容 和random\u samp

一些差异是显而易见的,例如
slist
hash\u集
类从未被纳入标准。我也在寻找更细微的差异,例如方法的返回值/参数差异,或不同的复杂性要求,或不同的迭代器无效条件。

除了:

  • std::basic_string
    配备了STL容器接口

  • 一些模板特性被添加到语言中以更好地支持STL,标准库的STL部分可以利用这些特性,但原始STL无法使用

SGI STL在C++标准中的“缺失”包括

  • slist
  • 哈希集
    哈希映射
    哈希多集
    哈希多映射
    以及与哈希函数相关的所有内容
  • random\u sample\n
  • 法律和概念
  • 大量向后兼容头,如
    algo.h

。。。我敢打赌你还可以找到一些。STL也有一些功能性的东西,在stdlib中很遗憾地被遗漏了,尽管C++0x修复了这一点

从STL文档中引用合成函数

计算范围内每个元素的sin(x)/(x+DBL_MIN)

变换(第一、最后、第一、,
compose2(divides(),
ptr_fun(sin),
bind2nd(plus(),DBL_MIN));
或者,对于:

transform(M.begin(),M.end(),ostream_迭代器(cout,”),
选择第二个();

std::map
中的操作符[]
与标准中的不同之处在于,它被定义为返回
(*((insert(make_pair(x,T())).first)).second
,而在STL
m[k]
中被定义为等价于
(*((m.insert(value_type(k,data_type()).first)).second

<> P>差异是一致的C++实现调用<代码> MaMaGuION/CODEM >,而STL直接构造了对。我能想到两个不同之处:

1) 如果RVO未能启动对
make\u pair
的调用,则该标准允许该对的额外副本(以及密钥和数据对象的副本)。正如我所读到的,STL不允许这种复制(当然,在
insert
中还有一种进一步的复制)。如果键或值类型具有具有可观察副作用的复制构造函数,则这一点很重要

2) 用户可以专门化
std::make_-pair
std::pair
。如果它们专门化了代码> MaxOxBuff[/Cuff] >,则保证它们的代码在标准C++中被调用,并且保证在STL中不被调用。 但是,如果这些专门化不满足模板的要求,则会导致UB,而在
make_pair
的情况下,我认为,如果它具有创建pair以外的任何可观察的效果,那么它就不满足要求。因此,在这种情况下,编写一个保证让您确定它是否已被调用的专门化可能是困难的或不可能的。在实践中,如果实现完成了显而易见的事情,并且使用了标准中的代码,那么您将很容易看到不同之处

用户也可以使用ADL重载
make_pair
,同样的警告,还有一个额外的复杂性,那就是我不太确定标准中提到的非限定函数调用是否要求实现进行相同的非限定调用。我肯定听说过一些实现在这种情况下对
std::which
进行了完全限定调用,可能是错误的


这就是你要找的那种东西吗?

我不熟悉详尽的清单。但是,可以根据您拥有的时间和需要的详细信息,将其与标准进行比较。

在STL中,即使将一个列表的一部分拼接到不同的列表中,
std::list::splice
的四参数版本也保证具有恒定的时间复杂度。因此,
std::list::size
不能保证具有恒定的复杂性,实际上至少在某些情况下保证为ω(n)。我还没有检查SGI实现是否在所有情况下都是Omega(n)

在C++03标准中,4-arg
splice
仅在将列表的一部分移动到同一列表中的不同位置时保证具有恒定的复杂性。这意味着列表的大小不会改变,因此允许使用
size()
为常数时间的实现。GNU坚持使用STL方法,但我相信Dinkum选择了恒定时间
size()


在C++11标准中,
size()
要求具有恒定的时间,因此实际上在某些情况下,
splice
保证为ω(n)。STL方法不再符合,因此GCC在添加了一个大小字段时,在“代码> STD::清单

>P>”中存在二进制不兼容性。STL允许C++实现不支持成员函数模板。(在这种情况下,所有成员函数模板和构造函数模板都不可用)。显然,标准不允许这样做。

正确,我不是在寻找历史课程-其他地方已经介绍过。@Mark:更改了我的答案。HTH。值得注意的是,其中一些在tr1中,将在c++0x:-)<代码> HasyObj/<代码>不在任何C++标准中,而是由编译器供应商广泛提供。这就是哈希表不使用t的原因
transform(first, last, first,
          compose2(divides<double>(),
                   ptr_fun(sin),
                   bind2nd(plus<double>(), DBL_MIN)));
transform(M.begin(), M.end(), ostream_iterator<double>(cout, " "),
          select2nd<map<int, double>::value_type>());