- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
Can you think of an algorithm that performs the below:
“The Big Brown Fox” => “Fox Brown Big The”
“How are you?” => “you? are How”
std::string reverse_words( const std::string& str )
{
std::string result;
result.reserve( str.length() );
size_t word_begin = 0;
while( word_begin < str.length() )
{
const size_t pos = str.find_first_of( ' ', word_begin );
pos = (pos != string::npos) ? pos : str.length();
std::string word = str.substr( word_begin, pos-word_begin );
word_begin = pos + 1;
if (result.length() > 0)
{
word.append( 1, ' ');
}
result.insert( 0, word );
}
return result;
}
ну как минимум твой алгоритм можно переделать так, чтобы в результирующую строку вставлять как положено в конец
еще есть вариант отдать поиск слов в строке std::istringstream
еще есть вариант использовать временный стек, куда складывать offset и length каждого слова, а потом из этого стека сделать верный результат\
а еще рекурсивно по строке
если использовать append то не будет лишних аллокаций
впрочем, в твоем решении много спорных мест
вместо += std::string(..) лучше использовать append(it1, it2)
result += std::string(" ") -> result += ' ';
если str начнется с пробела, твой результат тоже (ну это надо смотреть требования задачи, конечно)
и, самое главное, при пустой str не стоит делать ++ к итератору, уже равному rend()
поможем пушкову с миру по нитке
рекурсивная версия в копилку предложенных, минусы и плюсы очевидны
но такие велосипеды, конечно, не нужно изобретать заново
еще хочу привести к более читабельному виду, так как куча индексов меня расстраивает
str.length() будет равна 0
http://ideone.com/DP9a4
Вот так преобразуется в полный inplace:
http://ideone.com/etHZP
Никаких аллокаций.
Почти inplace:
Полный inplace с абсолютным 0 аллокаций:
>b=n;
замени на
b=++n;
А почему не
Имхо, так очевиднее.
Не ради холивара, просто хочу узнать мнение.
>C++
масло масляное я понимаю если два новых результата на выбор
типа res = exp ? first : second
но тут то одно а второй вообще искуственно смотрится фейк
одним словом тут логичнее
std::foreach для каждого слова std::reverse
std::accumulate для объединения слов обратно.
сплит по пробелу, реверс результата, и сборка фором, оно наверное даже одной строкой получилось бы
Эта утилитарная функция может вообще только один раз используется за проект, а то через месяц вообще ни разу не будет использоваться после переписывания алгоритмов, тогда зачем нужно было тратить время на неё, раз она перестала использоваться? Пустая трата времени на несколько тысяч утилитарных функций каждый раз.
>Расслабься и попробуй получать удовольствие
ещё и любитель в попку?
Мне заняться нечем, кроме как задницу за лишними строчками отсиживать? Я лучше на Канары съезжу.
книжка просто офигенна
что, работы совсем нет?