コードで std::map を使用してデータを保存しています。マップの反復子を使用して要素にアクセスしたり変更したりするのは非常に簡単ですが、いくつかの操作 (++、[] など) を実際に抑制する必要があるため、それが正しいかどうかはわかりませんが、ほとんどないようです。記事では std::map を直接継承しないことを推奨しているため、代わりにラッパーを作成しています。
class MyContainer
{
private:
std::map<int, int> data;
public:
int &operator[](int); // here we write the interface to control the behavior of accessing the data element
void &operator++();
void &operator--();
};
しかし、これは別の問題を引き起こします。実際、要素にアクセス/変更するために、コードのいたるところでイテレータを使用しています。しかし、マップが自己定義クラスに移動した後は、メイン プログラムでイテレータを使用してデータを処理できなくなりました。独自のイテレータを作成することを推奨する人がいますが、いくつかの記事を読んだ後、std::iterator を継承して独自のイテレータをカスタマイズすることを提案しているようです。それは簡単に思えますが、それでも私には抽象的すぎます。2つの疑問があります
1) マップを繰り返しますが、ラッパーは実際にはコンテナーではありません。また、マップ要素に対する次の操作 (++、-、[]) の動作を制御するには、マップの代わりに MyContainer を参照する自己定義イテレータを用意する必要があります。マップを進める必要があるため、混乱しているように思えますが、イテレータは代わりにラッパーを参照します。私はそれを機能させる方法がわかりません。同様のケースで従うことができる例はありますか? ありがとう。
2) コードでマップ要素に直接アクセスしたくないので、ラッパーで演算子を次のように定義しました。
int &operator[](int)
上記の関数では、返される参照は入力パラメーターに依存します。つまり、場合によっては、要素を参照する代わりに NULL 参照を返す可能性があります。ただし、NULL が返された場合、次の呼び出しは無効になります。
data[3]++;
data[3] は null 参照を返す可能性があるためです。しかし、要素を更新する前に、返された参照が null かどうかを確認するにはどうすればよいでしょうか?