有更简单的方法吗?

Is there simpler way?

本文关键字:方法 更简单      更新时间:2023-10-16

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

  1. 拆分输入字符串
  2. 将令牌以相反的顺序写入stdout

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

#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"));
}

略为缩写,由于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"));
}

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

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

也不能使用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"));
}

重要编辑:您需要在in_iterator()周围增加一对括号,以避免将整个语句解析为函数声明。@Steve Jessop的回答也有同样的问题。查看这个错误的示例,以了解由于这种混淆而导致的令人发毛的错误消息。

很好,你的老师鼓励使用适当的c++功能,但为了好玩,我认为使用copy只是将循环进一步向下移动堆栈…我认为递归是不使用显式循环的真正方法,就像下面这样…

#include <iostream>
#include <string>
typedef std::string::const_iterator iterator;
void print_reverse(iterator s, iterator i, iterator e)
{
  // last word
  if (i == e)
  {
    if (s != i)
      std::cout << std::string(s, i) << std::endl;
    return;
  }
  std::string word;
  if (*i == ' ')
  {
    // have word here
    word.assign(s, i);
    s = ++i;
  }
  else
    ++i;
  // recursively call   
  print_reverse(s, i, e);
  if (!word.empty())
    std::cout << word << std::endl;
}
int main(void)
{
  std::string foo ("foo bar bof bob");
  print_reverse(foo.begin(), foo.begin(), foo.end());
}