2012-10-13 35 views
0

這個問題已經在SO中完成了死亡。這裏是我的版本,使用傳統算法的STL函數來反轉字符串,然後翻轉單詞。有沒有使用循環更優雅的soln?使用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解決方案?

最佳, 薩勃拉曼尼亞

+1

爲什麼循環的恐懼? –

+0

我發現循環醜陋,使代碼不可改變! – subramanian

+0

絕對會喜歡看到一個! – subramanian

回答

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 " 
+0

這不是現場。你正在創建一個新的字符串。我想要一個就地解決方案。但很好的解決方案! – subramanian

+1

@SubramanianGanapathy:哦,對不起,我錯過了「就地」部分。我非常懷疑你可以在原地做*和*沒有循環。 –

+0

比我的好多了!謝謝! – subramanian