Anwendungsfall: ein Puffer von Datensätzen. Hier ist die Grundidee. Damit es funktioniert, muss der Konstruktor der Datensatzstruktur den Schlüssel kennen, der als Datensatznummer verwendet wird, wenn ein Element zur Karte hinzugefügt wird. Natürlich kann dies mit mehr Code gemacht werden, aber das sieht mir sehr elegant aus. Minimal codiert:Zugriffsschlüssel im Konstruktor der Struktur in einer Karte
#include <whatever>
struct record
{
string foo;
record(unsigned irec) { foo=readrecord(irec); }
};
map<unsigned,record>recbuf;
int main()
{
// if the element is not yet in the map, it should be read.
string foo_ten=recbuf[10].foo;
// do something with the result
printf("foo_ten: %s\n",foo_ten.c_str());
return 0;
}
Edit1: Code oben wird nicht funktionieren. Irgendwelche Ideen, wie man das zur Arbeit bringt? Edit2: I abgeleitet eine MapPlus Klasse das Hinzufügen eines weiteren Karte :: operator []:
template<class _Kty, class _Ty, class _Pr = less<_Kty>, class _Alloc = allocator<pair<const _Kty, _Ty> > >class mapplus :public map<_Kty, _Ty, _Pr, _Alloc>
{
public:
mapped_type& operator[](const _Kty &_Keyval)
{ // find element matching _Keyval or insert with default mapped
iterator _Where = _Mybase::lower_bound(_Keyval);
if (_Where == _Mybase::end()
|| _Mybase::_Getcomp()(_Keyval, _Mybase::_Key(_Where._Mynode())))
_Where = _Mybase::emplace_hint(_Where,
_Keyval,
_Ty(_Keyval));
return (_Where->second);
}
};
Dies funktioniert. Ich bin immer noch an Kommentaren interessiert, die mich darauf hinweisen, dass ich das unnötig unnötig gemacht habe. Habe ich? Kann es mit weniger Aufwand gemacht werden?
Was genau ist Ihre Frage? Funktioniert es sogar ohne Standardkonstruktor? –