一个简单的猜测:
不同的方法,你举有不同的行为,这可能是为什么一些使用迭代器和其他没有。
std::for_each
是通用的 - 有一个通用版本的方法在任何容器(甚至原始数组)上工作的最简单方法是使用迭代器。
std::vector::erase
是SequenceContainer概念的一部分,所以它必须有“通用”的形式,可以在任何类型的容器的工作(你可以使用一个std::vector
pos
和count
,但对于一个std::list
?还是std::set
? )。有了这样的概念是非常有用的创建通用代码:
template <typename C>
void real_remove(C &c, const typename C::value_type &value) {
c.erase(std::remove(c.begin(), c.end(), value), c.end());
}
这只能是因为std::...::erase
为任何SequenceContainer明确界定。
在另一方面,std::basic_string::substr
是std::basic_string
只有一部分(不像erase
这是std::list
的std::vector
一部分,...),并返回一个std::basic_string
(不迭代器,你会用一个迭代器在这里做?)。
,我们在std::basic_string
其他“非通用”(即,不属于由一些概念强制的)的方法,通常是整个家庭的find
方法,insert
具有size_type
,append
,等等上的过载。
在一个主观的看法,我认为这是最好有一个std::basic_string
不表现得像其他容器,因为它不是(我不知道的是,标准要求std::basic_string
是一个SequenceContainer
或任何类似的)。
,因为你想要一个新的std::basic_string
这里不能返回迭代器,所以你将有一个方法采取迭代器返回,但一个对象......我会觉得这更令人不安的比有pos
/count
,而不是first
/last
。
通过使用控制器可以获得相同的行为。例如。 'std :: string substring {text.begin(),text.end()}'。不知道为什么'substr'没有这样的过载。 – Zereges
@Zereges:因为它是多余的。如果你有两个迭代器表示子字符串,为什么把它们传递给'std :: string :: substr()'重载,如果你也可以将它们传递给'std :: string :: string()'。 – MSalters
@MSalters在STL中有很多冗余重载甚至函数。 STL的设计并非简约。 – Zereges