Для вектора N
элементов v = ( 1, 2, 3, 4, ... , N )
итератора диапазона возврата для всех кусков размера K<N
. Последний диапазон может быть меньше K
, если N%K!=0
.
Например:
v = ("a","b","c","d","e")
отображаемые строки
"ab", "cd", "e"
N=v.size();
K=2;
Одно из возможных решений:
for( unsigned int i=0; i<v.size(); i+=K )
cout << boost::join( v | boost::adaptors::sliced( i, min(i+K, v.size()) ), "" );
Это решение вполне нормально, но у него есть несколько проблем:
-
for
цикл - это необходимо? - если вы пишете
i+K
вместоmin(i+K, v.size())
алгоритм подавляет, нужно обратить дополнительное внимание на граничный случай. Это выглядит уродливо и отвлекает.
Можете ли вы предложить более элегантное решение? Благодаря элегантному решению я имею в виду использование общего алгоритма, встроенный или предоставляемый обычно используемой библиотекой (например, boost).
-------------------------- [править] ------------------ --------
Некоторые из вас выиграли рабочий пример, вот он.
#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;
}
Вывод:
ab
cd
e