有更简单的方法吗?

cim*_*ine 8 c++ stl

我想知道是否有更短/更简单的方法:

  1. 按字词拆分传入的字符串
  2. 将标记以相反的顺序写入标准输出

有两个限制:没有库,没有循环

#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <deque>

void list_string_elements(std::string s) {
    using namespace std;

    istringstream iss (s);
    deque<string> v;

    copy(istream_iterator<string>(iss), istream_iterator<string>(), front_inserter(v));

    copy(v.begin(),v.end(),ostream_iterator<string>(cout,"\n"));
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 7

轻微的缩写,我们可以通过以下的迭代器构造函数摆脱副本deque:

void list_string_elements(std::string s) {
    using namespace std;

    istringstream iss (s);
    deque<string> v(istream_iterator<string>(iss), (istream_iterator<string>()));
    copy(v.rbegin(),v.rend(),ostream_iterator<string>(cout,"\n"));
}
Run Code Online (Sandbox Code Playgroud)

注意额外的parens周围istream_iterator<string>(),以避免最令人烦恼的解析.


Ale*_* C. 5

没有,因为您需要存储单词,直到获取最后一个单词.尝试向后标记化会更复杂.

你也不能使用std::copy_backward因为std::istream_iterator不是双向的(只有输入).

std::deque非常适合这项任务.你可能也用vector+ back_inserter,并从复制v.rbegin()v.rend()ostream_iterator.

此外,标记字符串的逻辑最简单的表达方式istringstream.

基本上,这似乎是一个不能做得更好.

唯一的宗教小事是我无法忍受using namespace,即使在块范围内.

我的建议,行数相同:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

void output_tokens(const std::string& str)
{
    typedef std::istream_iterator<std::string> in_iterator;
    typedef std::ostream_iterator<std::string> out_iterator;

    std::istringstream in(str);
    std::vector<std::string> buffer(in_iterator(in), (in_iterator()));
    std::copy(buffer.rbegin(), buffer.rend(), out_iterator(std::cout, "\n"));
}
Run Code Online (Sandbox Code Playgroud)

重要编辑:您需要额外的括号括号,in_iterator()以避免将整个语句解析为函数声明.@Steve Jessop的答案也有同样的问题.看到这个错误的样本,见证由于这种混乱导致的拔毛错误信息.

  • 这确实是宗教的(也就是说,坚定地相信但绝对没有:) (3认同)