Мое решение:
std::vector<std::string> split(std::string const & s, size_t count)
{
size_t minsize = s.size()/count;
int extra = s.size() - minsize * count;
std::vector<std::string> tokens;
for(size_t i = 0, offset=0 ; i < count ; ++i, --extra)
{
size_t size = minsize + (extra>0?1:0);
if ( (offset + size) < s.size())
tokens.push_back(s.substr(offset,size));
else
tokens.push_back(s.substr(offset, s.size() - offset));
offset += size;
}
return tokens;
}
Код теста:
int main()
{
std::string s;
while (std::cin >> s)
{
std::vector<std::string> tokens = split(s, 5);
//output
std::copy(tokens.begin(), tokens.end(),
std::ostream_iterator<std::string>(std::cout, ", "));
std::cout << std::endl;
}
}
Вход:
012345
0123456
01234567
012345678
0123456789
01234567890
Выход:
01, 2, 3, 4, 5,
01, 23, 4, 5, 6,
01, 23, 45, 6, 7,
01, 23, 45, 67, 8,
01, 23, 45, 67, 89,
012, 34, 56, 78, 90,
ОнлайнДемонстрация: http://ideone.com/gINtK
Это решение стремится сделать токены четными , то есть все токены могут не иметь одинаковый размер.