マップされたデータを入力順にトラバースできるようにするコードを記述しました。カスタムSTLコンテナ
私はコード化されたソリューション時代のカップルがいた:
考えるとキータイプ、K、およびデータ・タイプ、D、 のstd ::マップ のstd ::ベクトル
1がランダムにしたかったですデータエントリを検索するには、map.find(K)
を使用します。エントリ順に地図をたどりたいときは、std::vector::iterator (begin(), end()]
を使います。
これは問題ありませんでしたが、練習として、'OrderedMap'
をSTL準拠のコンテナとして書きたいと思いました。私は(この議論にストリップダウン)もあります:
template <typename K, typename D>
class OrderedMapValue
{
private:
K first_ref;
std::map<K,size_t>& m;
std::vector<D>& v;
public:
const K& first
D& second
assignment operator=(const D& data)
{
std::map<K,size_t>::const_iterator iter = m.find(first_ref);
v[iter.second] = data; // error checking of iter stripped
}
};
は、さらに次のコードは動作します
template <typename K, typename D>
class OrderedMap
{
public:
typename OrderedMapValue<K,D>& OrderedMap<K,D>::operator[](const K&);
// snip...
};
class MyClass
{
public:
MyClass(std::string s) : _my_data(s) {}
private:
std::string _my_data;
};
を仮定:
OrderedMap<std::string,MyClass*> omap;
omap["MyKey"] = new MyClass("dummy");
しかし、このコードがない:
OrderedMap::iterator iter = omap.find("MyKey");
MyClass * obj = iter->second;
delete obj;
iter->second = new MyClass("dummy");
私はドンe何か a)構造的に愚かであるか b)不必要に複雑ですが、これはどのように行うべきですか?
私はここで車輪を再発明する可能性が高いと認識していますが、この努力は主にSTL容器、そのデザインパターン、および適切な使用についての私の知識を増やすことです。任意の洞察力を事前に
おかげで、OrderedMapValue::operator=
で
> second? 'iter'は' OrderedMap :: iterator'で '* iter'は' OrderedMapValue'ですか? –
それは正しい答えです。 –
あなたは正しいです、私はあなたの答えを受け入れました。概念的には、あなたは本当に必要なものの本質を釘付けにしました。 TYPE&演算子[]メソッドを詳しく見てみると、受け入れられた解決策としてマークされたコードが人を誤解させないように、アイロンがけされる必要があるいくつかの問題があることがわかりました。 私の(良い)意図は実績のある解決策を提供することでしたが、私は今これに戻ります。 –