Ладно, значит, менять элементы местами бесполезно, и односторонняя перезапись нам больше подходит. Убедившись в этом, мы можем решить, что такое действие можно выполнить просто с помощью операции *it = v.back();
std::move
, вставленный посередине (между =
и v.back()
), ускоряет выполнение кода. В случае со строками элемент вектора указывает на большую строку в куче. Нам не нужно ее копировать. Вместо этого при Получаем доступ к экземплярам класса std::vector быстрым или безопасным способом
Контейнер std::vector
std::vector
уже поддерживает подобные встроенные проверки!Как это делается
В этом примере мы попытаемся двумя способами получить доступ к элементу контейнера std::vector
1. Включим все необходимые заголовочные файлы и заполним вектор тысячей значений 123
#include
#include
using namespace std;
int main()
{
const size_t container_size {1000};
vector
2. Теперь обратимся к элементу, лежащему за пределами вектора, с помощью оператора []
cout << "Out of range element value: "
<< v[container_size + 10] << '\n';
3. Далее обратимся к элементу, лежащему за пределами вектора, с помощью функции at
cout << "Out of range element value: "
<< v.at(container_size + 10) << '\n';
}
4. Запустим программу и посмотрим, что произойдет. Сообщение об ошибке характерно для GCC. Прочие компиляторы отправят другие, но аналогичные сообщения. Первая операция чтения будет выполнена успешно, но странным образом. Она не заставит программу дать сбой, но мы получим
123
. Мы не можем увидеть результат второго обращения, поскольку оно намеренно сгенерировало сбой. Второй подход позволяет гораздо раньше выявить случайные выходы за границы контейнера.Out of range element value: -726629391
terminate called after throwing an instance of 'std::out_of_range'
what(): array::at: n (which is 1010) >= _Nm (which is 1000)
Aborted (core dumped)
Как это работает
Контейнер std::vector
[]
и функцию at
, и они, по сути, делают одинаковую работу. Однако функция выполняет дополнительные проверки границ и генерирует Оператор []
at
помогает определять ошибки, при этом вы почти не теряете в производительности. at
[]
в тех местах, где важна высокая производительность.Дополнительная информация