я использую []
для доступа к векторам в математическом коде. Я не хочу использовать at()
потому что я не люблю исключения. Я счастлив, явно проверяя границы в коде, когда я не уверен в своих показателях. Итак, мой код полон операторов такого рода: if(n >= 0 && n < vec.size())
,
Мой вопрос, я не нашел в std::vector
звонок как vec.isok(n)
который прямо говорит, что если да или же нет индекс в границах.
Я упустил это из виду? это сделало бы для намного более аккуратного кода в моем случае.
Кстати, явная проверка также я считаю более эффективной, чем at()
вызов, потому что, как правило, я использую вложенные векторные структуры и когда я проверяю индекс n
один раз я потом использую n
много раз внутри if
кронштейн, иногда тысячи раз. Итак, мой вопрос, вы видите более аккуратный способ сделать это без двух тестов в if
, Спасибо!
Да, std::vector
не имеет такой вещи, как std::vector::isOK(x)
, Вы можете деформироваться std::vector
в вашем SafeVector
и публиковать безопасные интерфейсы для использования.
Самый простой способ:
template <typename T>
inline bool isok(const std::vector<T>& vec,
typename std::vector<T>::size_type index)
{
return index >= 0 && index < vec.size();
}
затем назовите это как isok(vec, i)
Вы можете иметь собственную реализацию доступа к индексу вектора. И в этой вашей функции вы можете использовать эти чеки (одноразовые инвестиции) и использовать эту функцию для последующего доступа. Но опять же, даже если вы используете эту функцию, вам все равно нужно беспокоиться о том, что она возвращает в случае отсутствия индекса.
Вы также можете перейти на другую структуру данных. Если эти элементы могут иметь ключи (любой уникальный идентификатор), вы можете пойти на карту.