Я использую много векторов в моем программировании, и вообще пройти вектор для существующего значения я использую зЬй :: найти как в:станда :: найти против вывода шаблона из вектора
std::vector<int> foo;
std::vector<int>::iterator pos(std::find(foo.begin(), foo.end(), bar);
Это настоящая скука. Так что я пошел к получению шаблона из станд :: вектор для обеспечения найти метод:
template<class T>
class foovector : public std::vector<T>
{
public:
typename std::vector<T>::iterator find(const T& value)
{
return std::find(this->begin(), this->end(), value);
}
};
И теперь я могу сделать ФАЙНД более естественно:
foovector<int> foo;
foovector<int>::iterator pos(foo.find(bar));
Мой вопрос заключается в том, что это кажется естественным и очевидным расширением вектора, поэтому почему он не является частью STL или даже boost? Я чувствую, что мне не хватает какого-то Тайного Знания.
Свободные функции предпочтительнее функций-членов. Это те знания, которые вам не хватает. О, и 'std :: vector * v = новый foovector ; delete v; // UB'. –
GManNickG
Почему это «очевидное расширение»? Это очевидно только в том случае, если вы предполагаете, что функции-члены предпочтительнее, чем функции, не являющиеся членами. Это в значительной степени статья веры в Java, но это не делает ее истиной *. В C++ функции, не являющиеся членами, обычно предпочтительны, когда это возможно, как говорит @GMan. (В частности, 'std :: find' является универсальным и многоразовым, он также работает на' std :: list' или 'std :: deque' или даже на вашем собственном самодельном контейнере. Функция-член не может повторно использовать в других типах контейнеров, так почему это должно быть предпочтительным?) – jalf
Другим преимуществом версии, не являющейся членом, является то, что она работает на итераторах, а не на самом векторе. Я могу использовать его для поиска только в первых 10 элементах вектора: 'std :: find (foo.begin(), foo.begin() + 10)'. Вы также теряете эту способность в версии участника. – jalf