有更简单的方法吗?
Is there simpler way?
我想知道是否有更短/更简单的方法:
- 按 拆分输入字符串
- 将令牌以相反的顺序写入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());
}
相关文章:
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 让类与运算符一起工作更简单的方法
- 多个 if-else 测试的更简单方法
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?
- 有没有更简单的方法可以从用户那里获取三个数字并按升序打印它们?
- 约束模板参数顺序的更简单方法
- C++ 将整数与硬编码的整数集进行比较的更简单方法
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单
- 一种在没有 root 的情况下加载共享库的更简单方法
- 是否有一种更简单的方法可以使用GDB将C捕获的C结构捕获
- 生活的游戏邻居检查(更简单的方法可能吗?)
- 有没有更简单的方法可以做到:if(num1 > num2 && num1 > num3),以获得更大的变量列表进行比较?
- 有没有更简单的方法在 Rcpp 中使用 NumericVector 编写条件语句
- 访问派生属性和给定基指针的方法的更简单方法
- 是否有更简单的方法来定义C 中的for循环中的条件
- 格式化为 wstring 更简单的方法
- 我编写了一个C++程序来打印单词字母的排列.我想知道是否有其他更简单的方法可以做到这一点
- 为对象::tr传递QString的更简单方法
- 安全布尔成语 - 我是否找到了更简单的方法,还是我错过了什么
- 实现.cpp文件的更简单方法