Estoy usando algunas clases y varios métodos de utilidad que usan std :: vector.manera rápida de implementar pop_front a std :: vector
Ahora necesito usar cada fotograma un método pop_front - push_back en una de esas clases (pero todas están vinculadas, y funcionan juntas, así que no puedo cambiar solo una).
La mayoría de las operaciones se repiten sobre todas las operaciones de elementos y push_back, entonces lo que debo hacer para el mejor trabajo es: bifurcar el repositorio de esas clases y utilidades, plantilla todo y usar deque o list.
Pero esto significa mucha reescritura de código y muchas pruebas que me harán perder la fecha límite.
Así que necesito consejos para escribir un pop_front eficiente en un vector de tamaño estático (el tamaño no cambiará).
he encontrado una manera here:
template<typename T>
void pop_front(std::vector<T>& vec)
{
vec.front() = vec.back();
vec.pop_back();
vec.front() = vec.back(); // but should this work?
}
Y otra idea debería ser:
template<typename T>
void pop_front(std::vector<T>& vec, already_allocated_vector vec1)
{
vec1.clear();
copy(vec.begin(), vec.end()-1, vec1.begin());
copy(vec1.begin(), vec1.end(), vec.begin());
}
¿Cuál es el más rápido de estas dos soluciones? ¿Alguna otra solución?
¿Qué quiere decir con "el tamaño no cambiará"? Después de hacer pop_front, ¿el vector tendrá el mismo tamaño que antes? Si es así, ¿el último elemento debería ser basura? –
el vector tiene el mismo tamaño, porque después de un pop de repente hago un push. cada foto hice un pop y un push en el mismo método, así que antes y después de este método, el vector es del mismo tamaño – nkint
Antes de preocuparse por la velocidad, preocúpese por ** corrección **. Toda la velocidad en el mundo no significa nada si el resultado que obtienes es simplemente incorrecto, y por lo que yo sé, tus dos candidatos están equivocados. El primero debe llamarse 'pop_back_and_overwrite_front_with_penultimate', y el segundo debe llamarse' invoke_undefined_behavior_and_pop_back'. (Escribir en 'vec1.begin()' no está definido porque 'vec1' está vacío; sería necesario escribir' vec1.resize (vec.size() - 1) 'en lugar de' vec1.clear() '.) Cuando trato con operaciones vectoriales, a veces dibujo una imagen. Quizás eso también te ayude. –