2

それが私がこれまでに試したことです:

class menu_item
{
  private:

    // ....

    std::vector<std::string> options_;
    std::vector<std::string>::iterator current_;

  public:
    menu_item(std::string name, std::vector<std::string> options)
        : name_(name), options_(options)
    {
        current_ = begin(options_);
    }

    // ....

    const int curr_opt_id()
    {
        return current_ - begin(options_);
    }
};

しかし、curr_opt_id()戻ります-24。ここで私が間違っていることを誰かが知っていますか?

4

2 に答える 2

3

ベクターに追加すると、内部ストレージが再割り当てされ、既存のすべてのイテレーターが無効になる可能性があります。無効な反復子で算術演算を行うと、うまくいきません。

イテレータの無効化規則を参照してください

于 2013-05-03T15:41:16.390 に答える
2

ベクトルの反復子は、再割り当て時に無効になります。これは、現在の容量が実際のコンテンツと新しく追加された要素を保持するのに十分でない場合に発生します。

ここで発生する可能性が最も高いのはcurrent_、構築時に初期化される反復子が、その後の への挿入によって無効化されoptions_、式の評価時に未定義の動作が発生することです。

current_ - begin(options_)
于 2013-05-03T15:41:27.020 に答える