【问题标题】:Using for_each , copy with string使用 for_each ,用字符串复制
【发布时间】:2013-01-22 23:58:57
【问题描述】:

我的程序有问题,也许有人可以帮助我。所以:

int main() {
    std::string col = "maly tekst"
    for_each(/* FILL IN #2*/ f());
    copy(/*FILL IN #3*/);
    std::cout << col; }

输出应该是:TSKET YLAM
我知道我需要使用 Functor,所以我做了这样的事情:

#include <iostream>
#include <string>
#include <algorithm>
class f{
public:
void operator() (char &k)const
{
   k = toupper(k);
}
};
int main(){
std::string col = "maly tekst";
for_each(col.begin(),col.end(),f());
copy(col.rbegin(),col.rend(),back_inserter(col));
std::cout << col << std::endl;
}

但是现在当我运行它时它会返回:

MALY TEKSTTSKET YLAM

有人可以指出我正确的方法,或者帮助我完成这个示例程序吗?

谢谢

E: 忘记补充了,我只能在 main 中使用这个函数,我不能添加任何新的东西

【问题讨论】:

  • 你正在插入到同一个字符串的后面。
  • 如果你的仿函数如图所示,则需要将运算符设为public。如果不是如图所示,建议你改掉这个习惯。
  • 抱歉,我忘记添加公开:它现在是公开的

标签: c++ string stl iterator


【解决方案1】:
std::for_each(col.begin(),col.end(),f()); // as before
std::reverse(col.begin(), col.end());

【讨论】:

  • 对不起,我只能在 main 中使用这个函数。
  • @Silwest 需要原地反转,还是可以复制到另一个字符串中?
  • 这是个好问题,但我认为我需要尊重它,因为我无法在 main 中添加任何新内容,只有在 FILL IN 所在的地方。
  • @Silwest 我想不出使用std::copy 的好方法。
  • 这里有一些提示,可以用一种丑陋的方式解决问题,同时仍然“使用”std::copy() - 使std::copy() 本质上是一个无操作,除了评估它的参数(很容易做到)。逗号运算符 hack 可用于强制评估未评估为有用类型的表达式 - 左子表达式的结果被丢弃,但副作用不是。而reverse()std:copy() 参数没有任何用处,但副作用正是我们想要的。把这些放在一起,作业就完成了。我希望我没有说太多。
【解决方案2】:

如果不能使用std::reverse,则不能使用 std::copy 替换原始容器。要使用reverse order 打印col,另一种解决方法是将col 直接复制到stream iterator

for_each(col.begin(),col.end(),f());
std::copy(col.rbegin(), col.rend(), std::ostream_iterator<char>(std::cout, ""));

【讨论】:

  • 我认为这是一个很好的答案。输出应该是 TSKET YLAM 所以我们不能使用 copy 来写,imo 我们必须使用 copy 来更改字符串,但我不知道如何......
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2012-04-15
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多