1

C++ でインクリメントがどのように機能するかについて質問があります。

i++ または ++i の値について多くの主題を見てきましたが、割り当てに使用された場合はそうではありません。

[name, test] を含むandboost::container::flat_map<std::string, std::string*> param_;があります。boost::sregex_token_iterator ii

char* で作業していた場合、次のようにします

param[*ii] = new std::string(*(ii + 1));

しかし、それは機能していないので、次のようなことをしました:

 std::string tmp = *(ii++);
 this->param_[tmp] = new std::string(*(ii));

そして、私は正しい出力を得ています:

 name : test;

しかし、1行で実行しようとすると、正しい出力が得られません:最初に試しました:

this->param_[*(ii++)] = new std::string(*(ii));

しかし、私は得る: id : id;

そして、間違って私は試しました: this->param_[*(++ii)] = new std::string(*(ii));

そして私は得ます: test : name なぜ私は最初に「テスト」を取得するのか理解していますが、すでにインクリメントされているので2番目に「名前」を取得する理由はわかりませんii?

マップを表示するには、単純に

 for (auto ii = this->param_.begin(); ii != this->param_.end();++ii)
    std::cout << ii->first << ":" << *ii->second << std::endl;
4

2 に答える 2

1

(ii + 1)operator+はRandomAccessIterators でのみサポートされておりsregex_token_iterator、ForwardIterator のみであるため、機能しません。

ii++単一の式で同じ変数から読み書きしているため、バージョンの動作は未定義です。

本当に 1 つのステートメントでそれを実行したい場合は、次のようにすることができます。

param[*ii] = new std::string(*++boost::sregex_token_iterator(ii));

これはイテレータのコピーを作成し、オリジナルではなくコピーをインクリメントしますが、それが何をしているのか明確ではなく、複数のステートメントに分割する方がはるかに良いでしょう:

boost::sregex_token_iterator next = ii;
++next;
param[*ii] = new std::string(*next);
于 2013-06-16T15:37:20.297 に答える