【问题标题】:Reversing words of a string inplace using STL使用 STL 就地反转字符串的单词
【发布时间】:2012-10-13 21:03:32
【问题描述】:

这个问题已经在 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方案吗?

最好, 亚布拉曼尼亚

【问题讨论】:

  • 我发现循环很丑,而且代码不可读!
  • 当然,很想看到一个!
  • 抱歉,我错过了“就地”部分。我会使用std::rotatestd::reverse,但它看起来与您的代码并没有太大的不同。不过,我会考虑一下,如果我想出我喜欢的东西,我会发布它。
  • 我发布了一个单循环就地算法。它假设每个单词后面正好有一个空格,包括最后一个。如果你不喜欢长的for循环头,你可以把条件放在循环里面,break

标签: string stl stl-algorithm c++-standard-library


【解决方案1】:

这是一种使用迭代器和闭包的无循环方式:

#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 "

【讨论】:

  • 这不是就地。您正在创建一个新字符串。我想要一个就地解决方案。但是一个很好的解决方案!
  • @SubramanianGanapathy:哦,对不起,我错过了“就地”部分。我严重怀疑您是否可以在 没有循环的情况下就地执行此操作。
猜你喜欢
  • 2018-08-28
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多