这个问题已经在SO中死亡了。这是我的版本使用传统算法的STL函数来反转字符串然后反转单词。是否有更优雅的溶液而不使用循环?
std::string something;
std::getline(std::cin, something);
std::reverse(something.begin(), something.end());
for (size_t i = 0, size_t nextPos = something.find_first_of(' ', i);
nextPos != std::string::npos; i = nextPos + 1,
nextPos = something.find_first_of(' ', i)) {
std::string::iterator startIter = something.begin() + i;
std::string::iterator endIter = something.begin() + nextPos;
std::reverse(startIter, endIter);
}
假设输入完美,句子前后没有空格,单词之间只有一个单独的空格。是否存在不需要循环的stl解决方案?
最佳, 萨勃拉曼尼亚
答案 0 :(得分:2)
这是一个使用迭代器和闭包的无循环方式:
#include <iterator>
#include <algorithm>
#include <sstream>
#include <string>
std::istringstream iss(something);
std::string sentence;
std::for_each(std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>(),
[&sentence](std::string const & s) { sentence.insert(0, s + ' '); }
);
更新:以下是一个具有单个循环的就地算法:
#include <string>
#include <algorithm>
void reverse(std::string & s)
{
for (std::size_t pos, done = 0;
(pos = s.find(' ')) != s.npos && ++pos + done <= s.size();
done += pos)
{
std::rotate(s.begin(), s.begin() + pos, s.end() - done);
}
}
示例:
#include <iostream>
int main()
{
for (std::string line; std::getline(std::cin, line); )
{
reverse(line);
std::cout << '"' << line << '"' << std::endl;
}
}
试运行:
$ echo "hello world how are you " | ./prog
"you are how world hello "