Dado un vector de N
elementos v = (1, 2, 3, 4, ... , N)
iterador de rango de retorno en todos los trozos de tamaño K<N
. El último rango puede ser más pequeño que K
si N%K!=0
.Divida el contenedor en trozos, C++
Por ejemplo:
v = ("a","b","c","d","e")
visualización cadenas
"ab", "cd", "e"
N=v.size();
K=2;
Una posible solución es:
for(unsigned int i=0; i<v.size(); i+=K)
cout << boost::join(v | boost::adaptors::sliced(i, min(i+K, v.size())), "");
Esta solución es bastante bueno, pero tiene varios problemas:
for
lazo - ¿es necesario?- si escribe
i+K
en lugar demin(i+K, v.size())
aplasta el algoritmo, hay que prestar atención adicional al caso límite. Esto se ve feo y distrae.
¿Puede proponer una solución más elegante? Por solución elegante me refiero al uso de un algoritmo general, incorporado o proporcionado por la biblioteca de uso común (como el impulso).
-------------------------- [editar] ----------------- ---------
Algunos de ustedes ganaron ejemplo de trabajo, aquí está.
#include <iostream>
#include <vector>
#include <string>
#include <boost/range/adaptor/sliced.hpp>
#include <boost/algorithm/string/join.hpp>
#include <boost/assign.hpp> //just for fun
using namespace std;
using namespace boost::assign;
int main(int , char **)
{
const int K = 2;
vector<string> v;
v += "a","b","c","d","e";
for(unsigned int i=0; i<v.size(); i+=K)
cout << boost::algorithm::join(
v | boost::adaptors::sliced(i, min(i+K, v.size())), "")
<< endl;
}
Salida:
ab
cd
e
¿por qué no publica un ejemplo completo? –
@VJovic en el ejemplo, mostré lo que realmente necesito, pero esta es una pregunta más general, cómo ejecutar un algoritmo en cada porción de un contenedor por separado. – bartek
Lamentablemente, no puedo compilar su ejemplo, y perdí mi bola de cristal;) –