Olej писал(а):А вот числом вариантов как это можно сделать - задача хорошая...
Я же говорил, что в этом смысле задача благодатная...
Самый оптимальный из 5-ти предыдущих вариантов - 4-й (как может показаться странным) ... хотя о еальной оптимальности в такой задаче говорить смешно...
Код: Выделить всё
string rep4( const string& base, uint rep ) {
char buf[ 1000 ];
strcpy( buf, base.c_str() );
while( strlen( buf ) < rep )
memmove( buf + strlen( buf ), buf, strlen( buf ) + 1 ); // удвоить длину
buf[ rep ] = '\0';
return string( buf );
}
Например, при base="abc" и rep=30000:
- если 1-й вариант с посимвольным копированием потребует 30000 циклов копирования...
- следующие варианты с циклическим копированием base - 10000 циклов копирования...
- а этот вариант ... сколько? ... 15 ... ( 3 * 2 ^ 15 )
Но здесь сразу бросается в глаза, что это вариант - условный: char buf[ 1000 ] - 1000 здесь взято с потолка и для иллюстрации.
Можно от этого избавится?
Предлагаю:
Вариант 6:
Код: Выделить всё
string rep6( const string& base, uint rep ) {
char* buf = (char*)alloca( rep * 2 );
strcpy( buf, base.c_str() );
while( strlen( buf ) < rep )
memmove( buf + strlen( buf ), buf, strlen( buf ) + 1 ); // удвоить длину
buf[ rep ] = '\0';
return string( buf );
}
Вариант 7:
Код: Выделить всё
string rep7( const string& base, uint rep ) {
char buf[ rep * 2 ];
strcpy( buf, base.c_str() );
while( strlen( buf ) < rep )
memmove( buf + strlen( buf ), buf, strlen( buf ) + 1 ); // удвоить длину
buf[ rep ] = '\0';
return string( buf );
}
Мне тут кой-кто возражал, что char buf[ rep * 2 ] - не будет компилироваться ... но оно не только компилируется, но и работает
:
Код: Выделить всё
olej@nvidia ~/2015_WORK/in.WORK/SchoolCPP/repch $ ./repch
базовая строка?: 123456
длина результата?: 3
123
123
123
123
123
123
123
базовая строка?: 2345
длина результата?: 200
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
23452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523452345234523
базовая строка?: ^C
Правда, возможность эта -
расширение поздних стандартов VLA (VLA — variable-length array, массивы переменной длины) в C появляются в стандарте C99 ... в C++ не знаю с какого стандарта, но в C++11 оно уже работает.