gpt4 book ai didi

c++ - 如何为 std::transform 创建正确的接口(interface)

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:25 25 4
gpt4 key购买 nike

转换的签名是:

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)" 转换成另一个字符串完全相同的大小,但我想这不是您想要的。

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

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

关于c++ - 如何为 std::transform 创建正确的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17043006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com