My decision:
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; }
Test code:
int main() { std::string s; while (std::cin >> s) { std::vector<std::string> tokens = split(s, 5);
Input:
012345 0123456 01234567 012345678 0123456789 01234567890
Conclusion:
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,
Online Demo: http://ideone.com/gINtK
This solution, as a rule, makes the markers even, i.e. All tokens may not be the same size.