- 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;
}
TheHamstertamer 17.12.2011 18:21 # 0
pushkoff 17.12.2011 18:22 # 0
defecate-plusplus 17.12.2011 18:52 # 0
ну как минимум твой алгоритм можно переделать так, чтобы в результирующую строку вставлять как положено в конец
еще есть вариант отдать поиск слов в строке std::istringstream
еще есть вариант использовать временный стек, куда складывать offset и length каждого слова, а потом из этого стека сделать верный результат\
а еще рекурсивно по строке
pushkoff 17.12.2011 18:54 # 0
macGovno 17.12.2011 19:42 # +1
pushkoff 17.12.2011 19:44 # 0
если использовать append то не будет лишних аллокаций
defecate-plusplus 17.12.2011 20:28 # +2
впрочем, в твоем решении много спорных мест
вместо += std::string(..) лучше использовать append(it1, it2)
result += std::string(" ") -> result += ' ';
если str начнется с пробела, твой результат тоже (ну это надо смотреть требования задачи, конечно)
и, самое главное, при пустой str не стоит делать ++ к итератору, уже равному rend()
поможем пушкову с миру по нитке
рекурсивная версия в копилку предложенных, минусы и плюсы очевидны
но такие велосипеды, конечно, не нужно изобретать заново
pushkoff 17.12.2011 20:43 # 0
еще хочу привести к более читабельному виду, так как куча индексов меня расстраивает
defecate-plusplus 17.12.2011 20:47 # 0
str.length() будет равна 0
pushkoff 17.12.2011 20:56 # 0
guest 17.12.2011 21:35 # 0
http://ideone.com/DP9a4
Вот так преобразуется в полный inplace:
http://ideone.com/etHZP
Никаких аллокаций.
guest 17.12.2011 21:38 # 0
guest 17.12.2011 21:41 # 0
guest 17.12.2011 21:58 # +2
Почти inplace:
Полный inplace с абсолютным 0 аллокаций:
pushkoff 18.12.2011 01:16 # 0
lucidfoxGovno 18.12.2011 01:51 # −3
>b=n;
замени на
b=++n;
pushkoff 17.12.2011 19:00 # 0
UncleAli 17.12.2011 19:03 # 0
А почему не
Имхо, так очевиднее.
Не ради холивара, просто хочу узнать мнение.
pushkoff 17.12.2011 19:05 # −2
TheHamstertamer 17.12.2011 19:13 # +4
>C++
63F45EF45RB65R6VR 18.12.2011 00:09 # 0
масло масляное я понимаю если два новых результата на выбор
типа res = exp ? first : second
но тут то одно а второй вообще искуственно смотрится фейк
одним словом тут логичнее
guest 17.12.2011 19:54 # 0
std::foreach для каждого слова std::reverse
std::accumulate для объединения слов обратно.
pushkoff 17.12.2011 19:56 # 0
guest 17.12.2011 19:57 # +1
pushkoff 17.12.2011 19:59 # 0
сплит по пробелу, реверс результата, и сборка фором, оно наверное даже одной строкой получилось бы
guest 17.12.2011 20:03 # 0
pushkoff 17.12.2011 20:10 # 0
guest 17.12.2011 20:19 # +2
Эта утилитарная функция может вообще только один раз используется за проект, а то через месяц вообще ни разу не будет использоваться после переписывания алгоритмов, тогда зачем нужно было тратить время на неё, раз она перестала использоваться? Пустая трата времени на несколько тысяч утилитарных функций каждый раз.
guest 17.12.2011 20:26 # +1
guest 17.12.2011 20:37 # 0
guest 17.12.2011 21:46 # +3
guest 17.12.2011 21:52 # 0
>Расслабься и попробуй получать удовольствие
ещё и любитель в попку?
guest 17.12.2011 21:54 # 0
Мне заняться нечем, кроме как задницу за лишними строчками отсиживать? Я лучше на Канары съезжу.
TheHamstertamer 18.12.2011 16:35 # 0
roman-kashitsyn 19.12.2011 09:38 # +3
SmackMyBitchUp 19.12.2011 12:43 # +3
TheHamstertamer 13.01.2012 14:58 # 0
roman-kashitsyn 13.01.2012 15:03 # 0
книжка просто офигенна
TheHamstertamer 13.01.2012 15:09 # 0
guest 17.12.2011 19:55 # +2
lucidfoxGovno 18.12.2011 01:52 # −5
TarasB 18.12.2011 15:08 # +2
pushkoff 18.12.2011 15:08 # 0
TarasB 18.12.2011 15:13 # 0
pushkoff 18.12.2011 15:22 # +4
TarasB 18.12.2011 18:45 # +2
roman-kashitsyn 18.12.2011 23:09 # 0
что, работы совсем нет?
pushkoff 19.12.2011 10:35 # 0
SmackMyBitchUp 19.12.2011 12:43 # +4
roman-kashitsyn 19.12.2011 14:17 # +2
guest8 09.04.2019 12:24 # −999