Самый быстрый способ добавить деку в конец вектора?
Этот вопрос о скорости.
Я использую функцию в библиотеках openCV (в классе FaceRecognizer), которая требует ввода вектора. Мне нужно построить этот вектор путем объединения нескольких дек. Существуют ли более быстрые способы, кроме итерации по deque и возврата каждого элемента в вектор?
Немного информации о deque: это deque из 15 элементов, где я постоянно push_back, и если в нем более 16 элементов, я pop_front. Заказ имеет значение.
В качестве альтернативы я мог бы изменить деку на векторы, если это могло бы ускорить все, но из того, что я понимаю, будет медленно, когда я удаляю первый элемент вектора, когда он достигает размера 16.
2 ответа
Самый быстрый способ добавить деку в конец вектора?
Получение размера deque возможно в постоянное время (как для всех контейнеров STL), затем зарезервируйте пространство в векторе, чтобы ограничить накладные расходы на управление памятью одним выделением, и, наконец, переместите элементы из deque в вектор:
// std::vector v, std::deque d
v.reserve(v.size() + d.size());
std::move(std::begin(d), std::end(d), std::back_inserter(v));
d.clear(); // or reuse in some way
Если вы собираетесь добавить несколько векторов в вектор, рассмотрите reserve
полное хранение необходимо сразу.
Следить за std::bad_alloc
исключения, если объем данных огромен. В этом случае использование непрерывного хранилища вектора не идеально.
Вы могли бы сделать что-то вроде
очередь / вектор myItem;
// Swap the position to the back, if it's first use 0 if you like
myItem[position].swap(myItem.back());
myItem.pop_back();
Тогда это не перераспределяет весь список, когда вы удаляете с фронта.