При переносе диапазона между разными контейнерами std::list через splice откуда берётся линейная сложность?
База Hintsage
STL и контейнеры
Контейнеры, итераторы, алгоритмы и их сложность.
Практика
Вопросы: STL и контейнеры
За счёт чего последовательное добавление элементов в std::vector имеет амортизированную константную сложность, хотя отдельная операция иногда занимает линейное время?
Как категория итератора определяет сложность std::distance?
В каких условиях поиск в std::unordered_map перестаёт иметь ожидаемую константную сложность?
В практической задаче определите вывод программы и объясните, почему два размера различаются:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> v{1, 2, 3, 2, 4};
auto new_end = std::remove(v.begin(), v.end(), 2);
std::cout << v.size() << ' ' << std::distance(v.begin(), new_end);
}
Рассмотрите добавление элемента в конец std::deque. Определите, является ли обращение после операции корректным, и объясните различие между итератором и ссылкой:
#include <deque>
#include <iostream>
int main() {
std::deque<int> d{10, 20, 30};
auto it = d.begin() + 1;
int& ref = d[1];
d.push_back(40);
std::cout << *it << ' ' << ref << '
';
}
Объясните, почему применение std::lower_bound к std::list не делает поиск логарифмическим.
Найдите причину некорректности цикла удаления из std::unordered_map:
#include <string>
#include <unordered_map>
int main() {
std::unordered_map<int, std::string> m{{1, "a"}, {2, "b"}, {3, "c"}};
for (auto it = m.begin(); it != m.end(); ++it) {
if (it->first % 2 == 1)
m.erase(it);
}
}
После вставки элемента в середину std::vector какие ранее полученные итераторы можно считать действительными?
Объясните механизм: почему std::sort принимает только итераторы произвольного доступа?
Показано 41–50 из 50