2011-09-17 38 views
3

Click here看功能。正如你所看到的,除了最后三个之外,所有的都会返回对字符串的引用。最后一次重载返回一个迭代器,我猜测(我可能是错误的...)是因为参数中的迭代器可能在插入操作后变为无效。string :: insert中不同返回类型的原因是什么?

最后两个功能呢?他们为什么不返回对字符串的引用?这背后有什么理由吗?

回答

8

这是全部关于历史std::string是一件甚至不应该存在于C++中的东西。不是因为C++不应该有一个字符串类(当std::string正在被处理时它必须有成千上万),而是因为C++标准化意在编码现有的练习,并且没有单个字符串类只需要重新命名为std::string以便具有标准化的字符串类。所以这是“由委员会设计”,Stroustrup可怕的事情,因此,C++标准化努力就是为了避免。然而,图书馆工作组从未发现他们喜欢的字符串类,因此他们开始创建自己的字符串类,违反了标准化过程的主要基本原则之一。

而且好像这还不够,C++的预期规范化之前只有几个月,斯特劳斯跑进斯捷潘诺夫和他STL。一个容器和算法库在C++标准中令人尴尬地丢失了,这就是我认为Stroustrup首先对Stepanov感兴趣的原因。在STL,一边寻找怪我们所有的人,谁迄今已暴露于经典的OO库只,具有结合的独特优势一定的(如果外星人)优雅与效率,我们大家都在那个时候,被认为是不可组合的。因此,Stroustrup为了将STL纳入标准而进行了游说,并最终取得成功,从而推迟了整整一年的标准。 (并且我们不感谢这个延迟吧!我的意思是,将用C++来什么没有STL?!)
在这个过程中,人们认识到,std::string是一个容器,也因此这是追溯通过变成了一个完整的STL容器,将STL容器接口添加到其已经非常臃肿的接口中。

这就是为什么std::string现在具有取得和返回索引的函数,除了那些取得和返回迭代器。

0

这与字符串的臃肿接口有关。最后两个函数重载是标准STL容器的重载。其他人来自采用STL容器之前的时间,其中字符串有自己的不同(臃肿的)接口。

+1

“最后两个”应该是“最后三个”。 –

4

您引用的过载与所有其他标准容器的insert()操作一致。如果您愿意,您可以将string作为不透明容器char s。因此,如果您有一个使用insert()的通用算法,则可以在不更改代码的情况下将它与任何容器string一起使用。

质量图书馆的特点是提供丰富的界面,而且意外最少(应该工作的是什么),所以我会把它作为一个例子。

0

返回迭代器的唯一自然点是插入点。现在,当您添加多个字符时,它们将按顺序添加,并且对于每个插入操作,前一个迭代器都将失效。这意味着,如果实际上已将所有字符添加到字符串中,则不再有用于插入点的有效迭代器。