разбиение строки типа string на части c++
Пусть имеется строка вида:
string input_text = "abc, \aaa rrrrrrr, bbbbbb";
Символы разделители:
const string separation = ".:,;()?!/\*& \n\t\v\f\r";
задача:
необходимо разделить данную строку на подстроки, величины которых почти равнораспределенны на каждый поток. будем считать, что потоков в системе N штук.
что я имею ввиду, когда использую термин равнораспределенны? Отвечаю: если разбиение попало на слово, то необходимо двигаться до символа разделителя, чтобы слово не делилось.
Если потоков 3, на выходе будет:
1 abc
2, \
3 aaa
4 rrrrrrr,
5 bbbbbb
Что имею:
void MapFunctionCountWord(string input_text) {
const string separation = ".:,;()?!/\*& \n\t\v\f\r";
vector<string> cnt;
for (int i = input_text.find_first_not_of(separation, 0); i != string::npos; i = input_text.find_first_not_of(separation, i))
{ int end = input_text.find_first_of(separation, i);
cnt.push_back(input_text.substr(i, end - i));
i = end;
}
}
Функция делит строку на слова при помощи символов разделителей, но мне это не подходит, т.к. нужна порция данных для потока
Ответы (1 шт):
string input_text = "abc, aa=a rrrrrrr, bbbbb \nqq ss aa,a a";
const string separation = ".:,;()?!/\*& \n\t\v\f\r";
vector<string> text;
int i = input_text.size()/5;
int step = i;
int start = 0;
int finish = 0;
//int end = input_text.find_first_of(separation, i + 1);
cout << input_text.size() << endl;
for (i; i < input_text.size(); ++i)
{
if (separation.find(input_text[i]) != string::npos)
{
finish = i;
text.push_back(string(input_text.substr(start, finish - start)));
start = finish + 1;
i = start + step - 2;
}
if ((input_text.size() - start) < step || i == input_text.size() - 1)
text.push_back(string(input_text.substr(start, input_text.size() - start )));
}