Чтобы из аааа345рр получить {4,а}345{2,о}, то есть чтобы реализовать Кодирование длин серий (RLE):
template<class InputIt, class OutputIt>
OutputIt rle_encode(InputIt first, InputIt last, OutputIt d_first)
{
if (first == last) // empty
return d_first;
auto prev = *first++; // previous char
uintmax_t count = 1;
for ( ; first != last; ++first, ++count) {
if (prev != *first) { // ended run of the same consecutive elements
d_first = write_rle_run(d_first, prev, count); // write the run
prev = *first; // start new run
count = 0;
}
}
return write_rle_run(d_first, prev, count);
}
Это трансляция из Питона rle_encode() функции.
write_rle_run() записывает найденную серию подряд идущих символов в результат:
template<class OutputIt, class C>
OutputIt write_rle_run(OutputIt d_first, C character, uintmax_t count) {
if (count > 1) {
*d_first++ = '{';
for (char digit : std::to_string(count))
*d_first++ = digit;
*d_first++ = ',';
*d_first++ = character;
*d_first++ = '}';
}
else {
assert(count == 1);
*d_first++ = character;
}
return d_first;
}
Это работает и для массива:
const char a[] = "aaaa345pp";
char output[5*(sizeof a)/2];
rle_encode(std::begin(a), std::end(a), output);
и для string:
std::string text = "aaaa345pp";
std::string s;
rle_encode(std::begin(text), std::end(text), std::back_inserter(s));
и для потоков ввода/вывода:
std::istream_iterator<char> chars{std::cin}, eof;
rle_encode(chars, eof, std::ostream_iterator<char>(std::cout));
Полный пример кода.
В write_rle_run() можно передать желаемое число повторений от пользователя и адаптировать if (count > 1) условие.
Чтобы выполнить преобразование в обратную сторону, можно использовать rle_decode().
while (str[i+1]!='\0') { if (str[i] == str[i + 1]) for (int x=0;(x<"размер строки" && str[x]!='\0');x++)далее я делаю замену, где соответственно меняется размер строки, размер необходимо обновить, проблема здесь. – Nov 04 '17 at 10:39