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

はs のstd::stringコレクションであるため、正確にcharsを反復処理するため、この場合、文字列のサイズを変更することはできません。ただし、まったく同じサイズの別の文字列に変換できる場合がありますが、それはあなたが望むものではないと思います。charstd::transformdistance(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) { // ...
于 2013-06-11T11:57:16.723 に答える
1

このstd::transformのようなリファレンスでのドキュメントと例を読む必要があります。

この操作では、入力コンテナーの要素を取得し、出力コンテナーの要素を生成する必要があることに気付くでしょう。コンテナは文字列で、要素は文字であるため、署名はchar operator()(char). この場合、container-iterator は間違っています。とにかく、の反復子std::stringchar*s なので、std::ostream_iterator完全に無意味です。

そうは言っても、変換を文字列に適用すると、「作成者」部分文字列全体ではなく、単一の文字に変換が機能することに気付くでしょう。あなたがやろうとしていることは、C++ 11 のstd::regex正規表現ライブラリではなく、std::transform

于 2013-06-11T11:56:29.427 に答える