В настоящее время я работаю над проектом C++, который должен иметь как можно меньше внешних зависимостей, и поэтому я в значительной степени придерживаюсь STL и Boost. До сих пор я почти исключительно жил в Qt-стране, когда дело доходит до C++. В общем, я стараюсь использовать C# и Python, когда могу.
Сегодня я хотел проверить, содержит ли std::vector
определенный элемент. С Qt я бы сделал так:
QList< int > list;
list.append( 1 );
list.append( 2 );
list.append( 3 );
if ( list.contains( 2 ) )
{
// do something
}
Красиво и читабельно. Но у std::vector
нет метода contains
, что было неожиданностью. Хорошо... какая идиома STL для чего-то подобного? Поискав вокруг, кажется, что это:
std::vector< int > list;
list.push_back( 1 );
list.push_back( 2 );
list.push_back( 3 );
std::vector< int >::const_iterator result =
std::find( list.begin(), list.end(), 2 );
if ( result != list.end() )
{
// do something
}
Это (для меня) трудночитаемо и слишком многословно. Итак, я обнаружил, что пишу вспомогательную функцию, которая принимает вектор и значение и возвращает bool
в зависимости от того, было ли найдено значение или нет. По сути, шаблонный метод contains()
; оболочка для вышеуказанного вызова std::find
. Затем я могу использовать это так же, как в примере с Qt.
Я имею в виду несколько похожих служебных функций, которые обертывали бы другие идиомы STL ни по какой другой причине, кроме (ощущаемого) повышения удобочитаемости. Я хочу знать... это плохая идея? Другие люди делают то же самое? Я упускаю что-то важное? В какой-то момент код будет OSS, и я бы предпочел не делать что-то идиосинкразическое, что другим разработчикам C++ показалось бы странным.