Использование: буфер записей. Вот основная идея. Выполнение этой работы требует, чтобы конструктор структуры записи знал ключ, который используется как номер записи, когда элемент добавляется к карте. Конечно, это может быть сделано с большим количеством кода, но это выглядит очень элегантно для меня. Минимально закодированы:ключ доступа в конструкторе структуры на карте
#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: Код выше не будет работать. Любые идеи, как заставить это работать? Edit2: Я вывел класс mapplus добавив еще одну карту :: оператор []:
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);
}
};
Это делает работу. Меня все еще интересуют комментарии, указывающие на то, что я делал это без лишних сложностей и т. Д. Я? Можно ли это сделать с меньшим количеством суматохи?
Так что именно ваш вопрос? Он работает даже без конструктора по умолчанию? –