Función genérica para aplanar un contenedor de contenedores.

Estoy tratando de obtener un mejor control sobre los iteradores y las funciones genéricas. Pensé que sería un ejercicio útil escribir una función que convierte container1 < container2 > a container3 . Por ejemplo, debería poder convertir el vector< deque > a la list .

Pensé que todo el acceso al contenedor debería ser a través de iteradores, como las funciones en .

Aquí está mi código:

 #include  #include  // COCiter == Container of Containers Iterator // Oiter == Output Iterator template  void flatten (COCiter start, COCiter end, Oiter dest) { using namespace std; while (start != end) { dest = copy(start->begin(), start()->end(), dest); ++start; } } 

Pero cuando trato de llamarlo en el siguiente código:

 int main () { using namespace std; vector< vector > splitlines; vector flat; /* some code to fill SPLITLINES with vectors of strings */ flatten(splitlines.begin(), splitlines.end(), back_inserter(flat)); } 

Recibo un enorme mensaje de error de plantilla de C ++, undefined reference to void flatten< ... pages of templates ...

Siento que mi código era demasiado fácil de escribir, y debo necesitar algunas cosas más para garantizar que el tipo de datos en los contenedores internos coincida con el tipo de datos en el contenedor de salida. Pero no sé qué hacer.

Encontré el problema. Gracias a SFINAE (el fallo de sustitución no es un error) su comstackdor no pudo encontrar la plantilla correcta porque está intentando llamar a operator() al start escribiendo start() (probablemente un error tipográfico). Prueba esto:

 #include  #include  // COCiter == Container of Containers Iterator // Oiter == Output Iterator template  void flatten (COCiter start, COCiter end, Oiter dest) { while (start != end) { dest = std::copy(start->begin(), start->end(), dest); ++start; } } 

std::accumulate puede hacerlo por usted. Debe reunir el contenido de cada uno de los vectores internos en el vector exterior.

 vector> v_of_v; vector v = std::accumulate( v_of_v.begin(), v_of_v.end(), vector(), [](vector a, vector b) { a.insert(a.end(), b.begin(), b.end()); return a; });