Основная масса задач для начинающих связана с написанием циклов. И хотя много подобных задач можно сделать с помощью стандартных алгоритмов, тем не менее иногда простые циклы оказываются вполне достойным решением.
Одна из таких задач следующая: как вставить пробелы между символами строки. Например, допустим, у вас есть строка
std::string s( "abcdef" );
Нужно преобразовать эту строку к виду
"a b c d e f"
Прямолинейный и тем не менее достаточно эффективный подход следующий. Нужно сначала увеличить строку на число требуемых пробелов, а затем с помощью функции
std::swap сделать перестановку исходных символов строки с пробелами так, чтобы они чередовались.
Например
auto n = s.size();
s.resize( 2 * n - 1, ' ' );
for ( auto i = n, j = s.size(); i != j; --j )
{
std::swap( s[--i], s[--j] );
}
Этот код можно оформить в виде отдельной функции. Ниже приведена соответствующая демонстрационная программа.
#include <iostream>
#include <string>
#include <utility>
std::string & dilute_string( std::string &s, char c = ' ' )
{
if ( !s.empty() )
{
auto n = s.size();
s.resize( 2 * n - 1, c );
for ( auto i = n, j = s.size(); i != j; --j )
{
std::swap( s[--i], s[--j] );
}
}
return s;
}
int main()
{
std::string s( "abcdef" );
std::cout << "\"" << s << "\"" << std::endl;
std::cout << "\"" << dilute_string( s ) << "\"" << std::endl;
return 0;
}
Результатом работы программы будет следующий вывод на консоль:
"abcdef"
"a b c d e f"
В
JavaScript эту операцию можно выразить одной строкой:
var s = "abcdef";
s = s.split( "" ).join( " " );
alert( s );