class ElemNotFound {};
template <class ElemType, class IndexType>
class IContainer
{
public:
virtual ~IContainer() {};
virtual const ElemType& GetElem( const IndexType& index ) const = 0;
virtual void PutElem( const IndexType& index, const ElemType& elem ) = 0;
};
#include <map>
template <class ElemType, class IndexType>
class Container: public IContainer <ElemType, IndexType>
{
private:
typedef std::map<IndexType, ElemType> CMap;
CMap myMap;
public:
inline const ElemType& GetElem( const IndexType& index ) const
{
auto it = myMap.find(index); // line 1
if (it == myMap.end()) {
throw ElemNotFound();
}
return it->second;
}
inline void PutElem( const IndexType& index, const ElemType& elem )
{
myMap.insert(std::make_pair(index, elem)); // line 2
}
};
#include <string>
int main()
{
Container <std::string, int> c;
c.PutElem(1, "as");
c.PutElem(2, "G");
c.GetElem(2);
}
CmNsYXNzIEVsZW1Ob3RGb3VuZCB7fTsKdGVtcGxhdGUgPGNsYXNzIEVsZW1UeXBlLCBjbGFzcyBJbmRleFR5cGU+IApjbGFzcyBJQ29udGFpbmVyCnsKcHVibGljOgogICAgdmlydHVhbCB+SUNvbnRhaW5lcigpIHt9OwogICAgdmlydHVhbCBjb25zdCBFbGVtVHlwZSYgR2V0RWxlbSggY29uc3QgSW5kZXhUeXBlJiBpbmRleCApIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBQdXRFbGVtKCBjb25zdCBJbmRleFR5cGUmIGluZGV4LCBjb25zdCBFbGVtVHlwZSYgZWxlbSApID0gMDsKfTsKCiNpbmNsdWRlIDxtYXA+Cgp0ZW1wbGF0ZSA8Y2xhc3MgRWxlbVR5cGUsIGNsYXNzIEluZGV4VHlwZT4KY2xhc3MgQ29udGFpbmVyOiBwdWJsaWMgSUNvbnRhaW5lciA8RWxlbVR5cGUsIEluZGV4VHlwZT4Kewpwcml2YXRlOgogICAgdHlwZWRlZiAgc3RkOjptYXA8SW5kZXhUeXBlLCBFbGVtVHlwZT4gQ01hcDsKICAgIENNYXAgbXlNYXA7CgpwdWJsaWM6CiAgICBpbmxpbmUgY29uc3QgRWxlbVR5cGUmIEdldEVsZW0oIGNvbnN0IEluZGV4VHlwZSYgaW5kZXggKSBjb25zdCAKICAgIHsKICAgICAgICBhdXRvIGl0ID0gbXlNYXAuZmluZChpbmRleCk7IC8vIGxpbmUgMQoKICAgICAgICBpZiAoaXQgPT0gbXlNYXAuZW5kKCkpIHsKICAgICAgICAgICAgdGhyb3cgRWxlbU5vdEZvdW5kKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKICAgICB9CgogICAgIGlubGluZSB2b2lkIFB1dEVsZW0oIGNvbnN0IEluZGV4VHlwZSYgaW5kZXgsIGNvbnN0IEVsZW1UeXBlJiBlbGVtICkKICAgICB7CiAgICAgICAgIG15TWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihpbmRleCwgZWxlbSkpOyAgLy8gbGluZSAyCiAgICAgfQp9OwoKI2luY2x1ZGUgPHN0cmluZz4KCmludCBtYWluKCkKewogICAgQ29udGFpbmVyIDxzdGQ6OnN0cmluZywgaW50PiBjOwogICAgYy5QdXRFbGVtKDEsICJhcyIpOwogICAgYy5QdXRFbGVtKDIsICJHIik7CiAgICBjLkdldEVsZW0oMik7Cn0=