繁体   English   中英

如何为std :: transform创建正确的接口

[英]How to create the right interface for std::transform

转换的特征是:

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;
}

由于std::stringchar的集合,因此std::transform将对chars进行精确的distance(first1, last1)遍历,因此在您的情况下无法更改字符串的大小。 您也许可以将"$(author)"转换为另一个大小完全相同的字符串,但是我想这不是您想要的。

您可能想遍历流迭代器而不是char:

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) { // ...

你应该阅读文档和例子对std::transform像一个参考这个

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

话虽如此,如果将转换应用于字符串,而不是整个“作者”子字符串,您将注意到该转换仅对单个字符有效。 您要尝试执行的操作最好使用C ++ 11的std::regex则表达式库来实现,而不是使用std::transform

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM