История изменений
Исправление eao197, (текущая версия) :
А как быть тогда с BidirectionalIterator, std::reverse, std::placeholders, std::find_if_not, std::bind, std::equal_to, std::find, std::for_each и прочими?
А там вообще некоторые вещи непонятно зачем написаны. Для решения конкретной задачи можно этот же код записать более понятно:
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
string block_reverse_cpp11(string what) {
constexpr char separator = ' ';
auto is_separator = []( char ch ) { return ch == separator; };
auto last = end(what);
auto block_last = begin(what);
reverse(block_last, last);
do {
auto block_first = find_if_not(block_last, last, is_separator);
block_last = find(block_first, last, separator);
reverse(block_first, block_last);
} while(block_last != last);
return what;
}
int main() {
string str1[] =
{
"---------- Ice and Fire ------------",
"",
"fire, in end will world the say Some",
"ice. in say Some",
"desire of tasted I've what From",
"fire. favor who those with hold I",
"",
"... elided paragraph last ...",
"",
"Frost Robert -----------------------"
};
for(auto & s : str1)
cout << block_reverse_cpp11(s) << endl;
return 0;
}
Нифига не лаконично как в хаскелле, но вполне себе вменяемо. Плюс к тому, C++ный вариант замену inplace делает.
Исходная версия eao197, :
А как быть тогда с BidirectionalIterator, std::reverse, std::placeholders, std::find_if_not, std::bind, std::equal_to, std::find, std::for_each и прочими?
А там вообще некоторые вещи непонятно зачем написаны. Для решения конкретной задачи можно этот же код записать более понятно:
#include <algorithm>
#include <functional>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
string block_reverse_cpp11(string what) {
constexpr char separator = ' ';
auto is_separator = []( char ch ) { return ch == separator; };
auto last = end(what);
auto block_last = begin(what);
reverse(block_last, last);
do {
auto block_first = find_if_not(block_last, last, is_separator);
block_last = find(block_first, last, separator);
reverse(block_first, block_last);
} while(block_last != last);
return what;
}
int main() {
string str1[] =
{
"---------- Ice and Fire ------------",
"",
"fire, in end will world the say Some",
"ice. in say Some",
"desire of tasted I've what From",
"fire. favor who those with hold I",
"",
"... elided paragraph last ...",
"",
"Frost Robert -----------------------"
};
for(auto & s : str1)
cout << block_reverse_cpp11(s) << endl;
return 0;
}
Нифига не лаконично как в хаскелле, но вполне себе вменяемо. Плюс к тому, C++ный вариант замену inplace делает.