Click here查看功能。如您所见,除了最后三个之外的所有内容都返回对字符串的引用。第三个最后一个重载返回一个迭代器,我猜测(我可能错了......)是因为插入操作后参数中的迭代器可能变得无效。
最后两个功能怎么样?为什么他们没有返回对字符串的引用?这背后有什么理由吗?
答案 0 :(得分:8)
这完全是关于 历史 。 std::string
是一个在C ++中甚至不存在的东西。不是因为C ++不应该有一个字符串类(当std::string
被处理时它必须有数万个),而是因为C ++标准化旨在编纂 现有的实践 ,并且没有单个字符串类只需要重命名为std::string
以便拥有标准化的字符串类。所以它是“由委员会设计”,Stroustrup所畏惧的东西,因此,C ++标准化工作开始避免。
然而,图书馆工作组从未找到他们喜欢的字符串类,因此他们开始创建自己的字符串类,违反了标准化过程的主要基本原则之一。
好像这还不够,就在预期的C ++标准化之前几个月,Stroustrup遇到了Stepanov和他的 STL 。从C ++标准中尴尬地遗漏了一个容器和算法库,我猜想Stroustrup首先对Stepanov感兴趣。 STL虽然对我们所有人来说都很奇怪,他们到目前为止只接触过经典的OO图书馆,却具有 结合 某一特定(如果是外星人)的独特优势强烈的优雅与效率 ,在这一点上,我们所有人都认为它根本不可组合。
所以Stroustrup游说将STL纳入标准,最终成功,从而推迟了整整一年的标准。 (并不是我们今天感谢这个延迟!我的意思是,如果没有STL,C ++会是什么?!)
在此过程中,我们意识到 std::string
也是一个容器 ,所以它通过 <追溯变成了一个成熟的STL容器em>将STL容器接口 添加到其已经非常臃肿的界面中。
这就是为什么std::string
现在除了那些获取和返回迭代器之外还有函数获取和返回索引的原因。
答案 1 :(得分:4)
您引用的重载与所有其他标准容器的insert()
操作一致。如果愿意,您可以将string
视为char
的不透明容器。因此,如果您使用的是使用insert()
的通用算法,则可以将其与任何容器和一起使用string
,而无需更改代码。
质量库的标志是提供丰富的界面,最少惊喜(应该起作用的是什么),所以我将其作为一个实例。
答案 2 :(得分:1)
可能是因为他们在那里模仿其他容器的插入行为,例如std::vector
和std::list
。
答案 3 :(得分:0)
这与字符串的膨胀界面有关。最后两个函数重载是标准STL容器的重载。其他人来自采用STL容器之前的时间,其中字符串具有其自己的不同(臃肿)接口。
答案 4 :(得分:0)
返回迭代器的唯一自然点是插入点。现在,当您添加几个字符时,它们将按顺序添加,并且前一个迭代器对于每个插入操作都将失效。这意味着当你实际上已经将所有字符添加到字符串时,你就不再有插入点的有效迭代器了。