2

转换的签名是:

OutputIterator transform (InputIterator first1, InputIterator last1,
                        OutputIterator result, UnaryOperation op);

我想在下面创建一个通用令牌替换函子 msg_parser,所以我可以使用任何容器(下面的示例中使用的字符串)并传递容器的开始和结束来进行转换。这就是想法。

但我无法编译它。

这是我的代码。任何帮助将非常感激。

#include <iostream>
#include <iterator>
#include <string>
#include <map>
#include <algorithm>


class msg_parser {
public:
   msg_parser(const std::map<std::string, std::string>& mapping, const char token = '$')
      : map_(mapping), token_(token) {}

   // I can use a generic istream type interface to handle the parsing.   
   std::ostream_iterator operator() (std::istream_iterator in) {
      //body will go through input and when get to end of input return output

   }

private:
   const char token_;
   const std::map<std::string, std::string>& map_;
};


int main(int argc, char* argv[]) {
   std::map<std::string, std::string> mapping;
   mapping["author"] = "Winston Churchill";
   std::string str_test("I am $(author)");
   std::string str_out;
   std::transform(str_test.begin(), str_test.end(), str_out.begin(), msg_parser(mapping));
   return 0;
}
4

2 回答 2

3

由于std::stringchars 的集合,因此将准确地std::transform迭代charsdistance(first1, last1)次,因此在您的情况下,无法更改字符串的大小。不过,您也许可以转换成另一个完全相同 size 的"$(author)"字符串,但我想这不是您想要的。

您可能想要迭代流迭代器而不是字符:

std::stringstream istrstr(str_test);
std::stringstream ostrstr;
std::transform(std::istream_iterator<std::string>(istrstr), 
               std::istream_iterator<std::string>(), 
               std::ostream_iterator<std::string>(ostrstr, " "), // note the delimiter 
               msg_parser(mapping));

std::cout << ostrstr.str() << std::endl;

顺便说一句,您UnaryOperation在迭代类型上的工作,而不是在迭代器上,所以operator()应该是:

std::string operator() (std::string in) { // ...
于 2013-06-11T11:57:16.723 回答
1

您应该阅读此类std::transform参考中的文档和示例。

您会注意到该操作将获取输入容器的一个元素并为输出容器生成一个元素。由于您的容器是字符串并且元素是字符,因此签名应该是char operator()(char). 在这种情况下,容器迭代器是错误的。无论如何,std::stringchar*s 的迭代器,所以你std::ostream_iterator是完全没有意义的。

话虽如此,您会注意到转换适用于单个字符,如果您将其应用于您的字符串,而不是整个“作者”子字符串。您尝试做的最好是使用 C++11 的std::regex正则表达式库来实现,而不是使用std::transform

于 2013-06-11T11:56:29.427 回答