Comments 11
В C++ не шарю, но ради любопытства прочитал.
начиная с Qt6 QList == QVector.
До Qt6 QList это хитромудрёный index-based массив. Не припомню чтобы он был схож по функционалу с std::list
QList - более расширенный чем std::list
Только это неправда.
QList ведёт себя как std::vector<T> для объектов небольшого размера (меньше указателя)
или как std::vector<std::unique_ptr<T>> для объектов больше указателя.
Результат: элементы в диапазоне от [first, last] удалятся и вставятся [iterator, iterator + last]
В с++ диапазоны обычно не включают правую границу, в документации указан диапазон [first, last).
А указывать тип в качестве начала диапазона вообще нельзя.
Всё-таки есть отличия между at() и оператором [index]:
https://en.cppreference.com/w/cpp/container/vector/at
at() проверяет выход за пределы контейнера и кидает исключение, а оператор [index] этого не делает.
Статью я под LeetCode писал, как там обрабатывать исключение в форме: std::cout <<
exc.what() << '\n';
. То есть я открыл рандомную задачу и проверял, как там ведут себя функции, если бы он возвращал vec.end(), то это легко обрабатывается, а std::cout - придется использовать streambuff и rdbuf - так можно делать, но неудобно и я так никогда не делал на литкоде.
если вектор пустой и вы вызвали pop_back(), то ничего не произойдет, так как внутри идет проверка на!empty(), про которую написано ниже
Calling pop_back
on an empty container results in undefined behavior.
Увидел, уберу - скорее всего у меня выдавало UB, но просто ничего значимого для остановки программы не происходило, а загуглить мозгов у меня не хватило.
Компилятор предполагает, что UB при выполнении не происходит.
Можно предположить, что при вызове pop_back
на векторе, указатель на конец просто уменьшится на размер данных.
Если вызвать на пустом векторе, то он окажется в настолько невалидном состоянии, что практически любая операция может сломать программу.
Слушайте, разве эти знания действительно нужны человеку, который собирается начать решать литкод? Векторы и деки - это важные вещи, но необходимые их методы гуглятся за несколько секунд. Когда ты сдаешь задачу в систему автопроверки, она считается решенной, если она проходит все тесты. Таким образом, гораздо важнее для новичка будет учиться непосредственно решению задач, придумыванию алгоритмов.
Это как на кодфорсах: новички постоянно спрашивают гроссмейстеров какой у них сетап, каким редактором кода они пользуются, какие есть фишки, какой у них стоит шаблон и как его настроить.
Поймите, чтобы хорошо решать задачи, вам это все (поначалу) не нужно. Даже хитрые алгоритмы не нужны. Просто начните решать, все остальное придет с опытом, или подсмотрите у кого-то в сабмитах и намотаете себе на ус. Будет в тысячу раз полезнее подобных статей.
Базовый набор для решения задач на LeetCode/Codeforces, ч.1