一個簡單的猜測:
不同的方法,你舉有不同的行爲,這可能是爲什麼一些使用迭代器和其他沒有。
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