Конечно, можно at
. Сделать это нетрудно. Мы окружим вызов функции at
блоком try
и определим код обработки ошибки в блоке catch
:
try {
std::cout << "Out of range element value: "
<< v.at(container_size + 10) << '\n';
} catch (const std::out_of_range &e) {
std::cout << "Ooops, out of range access detected: "
<< e.what() << '\n';
}
std::array
также предоставляет функцию at
.
Сохраняем сортировку экземпляров класса std::vector
Массивы и векторы не сортируются самостоятельно. Если нам потребуется такая возможность, мы всегда можем воспользоваться структурами данных, которые предоставляют ее автоматически. Контейнер std::vector
идеально подходит для нашего случая, ведь добавлять в него новые элементы
Как это делается
В этом примере мы заполним контейнер std::vector
случайными словами, отсортируем их, а затем вставим дополнительные слова с учетом сортировки.
1. Сначала включим все необходимые заголовочные файлы:
#include
#include
#include
#include
#include
#include
2. Кроме того, объявим пространство имен std
, чтобы не писать префиксы std::
:
using namespace std;
3. Далее напишем небольшую функцию main
, в которой вектор заполняется случайными строками:
int main()
{
vector
"without", "order", "aaa",
"yyy"};
4. Затем is_sorted
из STL, показывающей, что изначально вектор
assert(false == is_sorted(begin(v), end(v)));
sort(begin(v), end(v));
assert(true == is_sorted(begin(v), end(v)));
5. Наконец, добавим случайные слова в отсортированный вектор с помощью новой функции insert_sorted
, которую будем реализовывать далее. Эти слова сразу нужно помещать в правильную позицию, поэтому вектор останется отсортированным:
insert_sorted(v, "foobar");
insert_sorted(v, "zzz");
6. Теперь реализуем функцию insert_sorted
и расположим ее перед функцией main:
void insert_sorted(vector
{
const auto insert_pos (lower_bound(begin(v), end(v), word));
v.insert(insert_pos, word);
}
7. Теперь вернемся в функцию main
— туда, где мы остановились, — и продолжим работу, выведя содержимое вектора и увидев, что процедура вставки отработала:
for (const auto &w : v) {
cout << w << " ";
}
cout << '\n';
}
8. Компиляция и запуск программы дадут следующий результат:
aaa foobar order random some without words yyy zzz
Как это работает
Вся программа построена вокруг функции insert_sorted
, решающей задачу, которой посвящен этот раздел. Для каждой новой строки эта функция определяет позицию в отсортированном векторе (куда нужно произвести вставку), позволяющую
Позиция определяется с помощью функции STL lower_bound
, принимающей три аргумента. Первые два из них указывают на
Определив правильную позицию, мы передаем ее методу insert
контейнера std::vector
, который принимает всего два аргумента. Первый аргумент — итератор, указывающий на позицию в векторе, в которую будет вставлен второй параметр. Очень удобно, что можно использовать итератор, возвращаемый функцией lower_ bound
. Второй аргумент — это, конечно же, вставляемый элемент.
Дополнительная информация