Fusionar la implementación de clasificación usando iteradores -- ++ campo con algorithm campo con c++11 campo con sorting campo con c++14 camp codereview Relacionados El problema

Merge sort implementation using iterators


2
vote

problema

Español

Aquí está mi primer intento de implementar una especie de combinación usando iteradores -

  std::shared_ptr<IConnection> connection = mapserver.OpenConnection("WFS:http://192.168.139.129/cgi-bin/tinyows.exe");     std::shared_ptr<IData> frida = connection->QueryLayer("frida");     Areas *areas = new Areas(frida);      vector<Area> areasVector = areas->getAreas(); 2  

Estoy abierto a consejos / sugerencias sobre la implementación y me encantaría escuchar cómo podría mejorarlo.

Original en ingles

Here is my first try to implement merge sort using iterators -

#include <algorithm> #include <iterator> #include <vector>  namespace base { namespace merge {      template <typename Iterator, typename Compare>     void mergeBack(Iterator begin, Iterator mid, Iterator end, Compare comp)     {         typedef typename std::iterator_traits<Iterator>::value_type ElemType;         std::vector<ElemType> left, right;          left.reserve(mid - begin);         right.reserve(end - mid);          std::copy(begin, mid, std::back_inserter(left));         std::copy(mid, end, std::back_inserter(right));          size_t j = 0, k = 0;         auto i = begin;         for (; i != end && j < left.size() && k < right.size(); ++i) {             *i = comp(left[j], right[k]) ? left[j++] : right[k++];         }          while (j < left.size()) {             *(i++) = left[j++];         }          while (k < right.size()) {             *(i++) = right[k++];         }     }       template <typename Iterator, typename Compare = std::less<>>     void sort(Iterator begin, Iterator end, Compare comp = Compare())     {         if (end - begin > 1) {             const auto middle = (end - begin) / 2;             merge::sort(begin, begin + middle, comp);             merge::sort(begin + middle, end, comp);             mergeBack(begin, begin + middle, end, comp);         }     } } } 

I'm open to advice/suggestions about the implementation and would love to hear how I could make it better.

              

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Debe preferir mover los valores siempre que sea posible.

  trait HListSum[L <: HList] {   type Out <: Nat } 9  

Cada llamada de Mergegeback terminará asignando 2 nuevos buffers. Puede evitarlo al prealizar el búfer secundario y flip flopping entre ellos, pero eso es difícil de hacer en la versión recursiva. Por eso prefiero la versión iterativa que se vuelve de abajo hacia arriba.

 

You should prefer to move values whenever possible.

std::move(begin, mid, std::back_inserter(left)); std::move(mid, end, std::back_inserter(right));  size_t j = 0, k = 0; auto i = begin;  for (; i != end && j < left.size() && k < right.size(); ++i) {     *i = std::move(comp(left[j], right[k]) ? left[j++] : right[k++]); }  while (j < left.size()) {     *(i++) = std::move(left[j++]); }  while (k < right.size()) {     *(i++) = std::move(right[k++]); } 

Every call of mergeBack will end up allocating 2 new buffers. You can avoid that by preallocating the secondary buffer and flip flopping between them but that is tricky to do in the recursive version. Which is why I prefer the iterative version that goes bottom up.

 
 
         
         

Relacionados problema

1  Minimax de gama de iteradores de entrada  ( Minimax of input iterator range ) 
Publiqué anteriormente una Pregunta al encontrar el valor máximo de una dispatch_sync(dispatch_get_main_queue(), ^{5 Rango. Por completo, pensé que serí...

7  Obtener extensión (s) de camino  ( Get extensions from path ) 
Estoy escribiendo una función de utilidad que devuelve la (s) extensión (s) de un boost::filesystem::path (V3). La clase de camino de Boost ya tiene parte d...

5  Clase genérica de múltiples dimensiones / matriz en C ++  ( Generic multi dimension grid array class in c ) 
Estoy escribiendo una matriz multidimensional genérica de C ++ 14 para el propósito de la ciencia computacional. Las "características" hasta ahora para la c...

5  Implementación TIC-TAC-TOE en C ++  ( Tic tac toe implementation in c ) 
Primer programa completo en C ++. Estoy teniendo problemas para entender cuando debería usar clases y cuando no debería. En última instancia, después de esta ...

4  (C ++ 14) Estado de manejo en la función C-Style Pointer Callbacks  ( C14 handling state in c style function pointer callbacks ) 
Tengo algunos problemas que se presentan con una solución sensible para usar el estado compartido en un puntero de función de estilo C. Estoy usando GLFW para...

5  Meta Funciones para secuencias de exponentes de 2  ( Meta functions for sequences of exponents of 2 ) 
He implementado algunas funciones META para crear secuencia para los exponentes de 2. Me encantaría saber si hay alguna forma de hacer que el código sea más o...

12  Aplique una función a cada elemento de una tupla ("Mapa" una tupla)  ( Apply a function to each element of a tuple map a tuple ) 
c ++ no (todavía) tiene una 'MAP' función de orden superior < / a>, ciertamente no uno que se aplica a una secuencia de valores de compilación como una tupla...

8  Implementación de un algoritmo * en C ++  ( Implementation of a algorithm in c ) 
He implementado el algoritmo de búsqueda de la ruta A-STAR para una cuadrícula 2D. La función devuelve una lista de posiciones de una ruta aceptable. main.c...

2  Set persistente (árbol negro rojo)  ( Persistent set red black tree ) 
Esta es una estructura de datos parcialmente persistente utilizando un árbol negro rojo. Se copiarán $ O (LG (N)) $ artículos para cada operación eliminar o...

5  Tabla de conversión de temperatura en C ++ 14  ( Temperature conversion table in c14 ) 
Estoy aprendiendo C ++ y pensé que intentaría escribir mi mano al escribir un programa básico en C ++ moderno. Siempre estoy buscando formas de reducir mi cód...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos