# V831. Decreased performance. Consider replacing the call to the 'at()' method with the 'operator[]'.

Анализатор обнаружил фрагмент кода, в котором используется доступ к элементу последовательного контейнера (std::array, std::vector или std::deque) с помощью метода 'at', при этом известно, что индекс является валидным.

Метод 'at' получает элемент контейнера по заданному индексу. Перед этим он проверяет находится ли индекс в допустимых пределах, и в случае выхода за границу контейнера генерирует исключение 'std::out_of_range'. Если известно, что при обращении по индексу выход за границу не случится, использование метода 'at' можно безопасно заменить на 'operator[]', который не выполняет дополнительных проверок. Удаление избыточной проверки ускорит выполнение кода.

Рассмотрим пример:

    std::vector<std::string> namelessIds;
    ....
    if (!namelessIds.empty()) {
      LIST<char> userIds(1);
      for (std::string::size_type i = 0; i < namelessIds.size(); i++) {
        userIds.insert(mir_strdup(namelessIds.at(i).c_str()));           // <=
      }
      ....
    }

При обходе элементов вектора в цикле, выбираемый номер элемента не может стать больше номера самого последнего элемента. Таким образом, код можно упростить если заменить 'at' на квадратные скобки:

    std::vector<std::string> namelessIds;
    ....
    if (!namelessIds.empty()) {
      LIST<char> userIds(1);
      for (std::string::size_type i = 0; i < namelessIds.size(); i++) {
        userIds.insert(mir_strdup(namelessIds[i].c_str()));
      }
      ....
    }