入力された順序でマップされたデータをトラバースできるようにするコードを作成しました。
私が数回コーディングした解決策は次のとおりです。
キータイプ K とデータ型 D を指定すると、std::map std::vector
データ エントリをランダムに見つけたい場合は、 を使用します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");
私が何かをしたと仮定すると、a) 構造的にばかげている、または b) 不必要に複雑な場合、これをどのように行う必要がありますか?
ここで車輪を再発明する可能性が高いことは認識していますが、繰り返しになりますが、この取り組みは主に、STL コンテナー、その設計パターン、および適切な使用に関する知識を増やすことです。
ご意見をお寄せいただきありがとうございます。