В настоящее время я работаю над проектом на C++, который должен иметь как можно меньше внешних зависимостей, и поэтому я в значительной степени придерживаюсь STL и Boost. До сих пор я почти исключительно жил в Qt-land, когда речь зашла о C++. В общем, я стараюсь использовать C# и Python, когда могу.Является ли обтекание идиом STL для удобства чтения хорошей идеей?
Сегодня я хотел проверить, содержит ли std::vector
определенный элемент. С Qt я бы сделал это следующим образом:
QList<int> list;
list.append(1);
list.append(2);
list.append(3);
if (list.contains(2))
{
// do something
}
Nice и удобочитаемый. Но у 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
в зависимости от того, было ли это значение найдено или нет. В принципе, шаблонный метод ; обертка для вышеуказанного вызова std::find
. Затем я могу использовать это способом, похожим на пример Qt.
У меня есть несколько подобных функций утилиты, которые могли бы обернуть другие идиомы STL ни по какой другой причине, а (воспринимаемое) увеличение читаемости. То, что я хочу знать, это ... это плохая идея? Другие люди делают то же самое? Я пропустил что-то важное? Код будет OSS в какой-то момент, и я бы предпочел не делать что-то своеобразное, что другие разработчики C++ бывали странными.
@rgrig Это для меня все еще не так читаемо, как пример Qt, и, как вы сказали, это не очень эффективно. Он должен быть O (n/2), а не O (n). – Lucas
Я не уверен, о чем вы говорите, поскольку он, очевидно, удален, но O (n/2) - O (n). Однако, по вопросу эффективности, такая оболочка может быть перегружена для наборов/карт, чтобы использовать их для сортировки без каких-либо изменений на сайте вызова. –