#include <map>
#include <set>
#include <iostream>
using namespace std;
// work - for let say - sets
template <class Type_>
struct Key {
Key(typename Type_::const_iterator it) : value(*it) {}
typename Type_::key_type value;
};
// work - for map<***>
template <class Key_, class Value_, class Comp_, class Alloc_>
struct Key<map<Key_, Value_,Comp_,Alloc_> > {
typedef map<Key_, Value_,Comp_,Alloc_> Type_;
Key(typename Type_::const_iterator it) : value(it->first) {}
typename Type_::key_type value;
};
template< typename T >
const typename T::key_type getKey( const typename T::const_iterator& it )
{
return Key<T>(it).value;
}
template< typename T >
void dumpOut( T& coll )
{
for ( typename T::const_iterator it = coll.begin(); it != coll.end(); ++it )
{
const typename T::key_type& a = getKey<T>(it);
cout << a << endl;
}
}
int main()
{
set<int> s1;
s1.insert(10);
s1.insert(15);
s1.insert(20);
dumpOut< set<int> >( s1 );
map<int, int> m1;
m1.insert( pair<int, int>(11, -1) );
m1.insert( pair<int, int>(16, -1) );
m1.insert( pair<int, int>(21, -1) );
dumpOut< map<int, int> >( m1 );
return 0;
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIHdvcmsgLSBmb3IgbGV0IHNheSAtIHNldHMKdGVtcGxhdGUgPGNsYXNzIFR5cGVfPgpzdHJ1Y3QgS2V5IHsgCiAgIEtleSh0eXBlbmFtZSBUeXBlXzo6Y29uc3RfaXRlcmF0b3IgaXQpIDogdmFsdWUoKml0KSB7fQogICB0eXBlbmFtZSBUeXBlXzo6a2V5X3R5cGUgdmFsdWU7Cn07CgovLyB3b3JrIC0gZm9yIG1hcDwqKio+CnRlbXBsYXRlIDxjbGFzcyBLZXlfLCBjbGFzcyBWYWx1ZV8sIGNsYXNzIENvbXBfLCBjbGFzcyBBbGxvY18+CnN0cnVjdCBLZXk8bWFwPEtleV8sIFZhbHVlXyxDb21wXyxBbGxvY18+ID4geyAKICAgdHlwZWRlZiBtYXA8S2V5XywgVmFsdWVfLENvbXBfLEFsbG9jXz4gVHlwZV87CiAgIEtleSh0eXBlbmFtZSBUeXBlXzo6Y29uc3RfaXRlcmF0b3IgaXQpIDogdmFsdWUoaXQtPmZpcnN0KSB7fQogICB0eXBlbmFtZSBUeXBlXzo6a2V5X3R5cGUgdmFsdWU7Cn07CgoKdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgpjb25zdCB0eXBlbmFtZSBUOjprZXlfdHlwZSBnZXRLZXkoIGNvbnN0IHR5cGVuYW1lIFQ6OmNvbnN0X2l0ZXJhdG9yJiBpdCApCnsKICAgIHJldHVybiBLZXk8VD4oaXQpLnZhbHVlOwp9Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CnZvaWQgZHVtcE91dCggVCYgY29sbCApCnsKICAgIGZvciAoIHR5cGVuYW1lIFQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29sbC5iZWdpbigpOyBpdCAhPSBjb2xsLmVuZCgpOyArK2l0ICkKICAgIHsKICAgICAgICBjb25zdCB0eXBlbmFtZSBUOjprZXlfdHlwZSYgYSA9IGdldEtleTxUPihpdCk7CiAgICAgICAgY291dCA8PCBhIDw8IGVuZGw7CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgc2V0PGludD4gczE7CiAgICBzMS5pbnNlcnQoMTApOwogICAgczEuaW5zZXJ0KDE1KTsKICAgIHMxLmluc2VydCgyMCk7CgogICAgZHVtcE91dDwgc2V0PGludD4gPiggczEgKTsKCiAgICBtYXA8aW50LCBpbnQ+IG0xOwogICAgbTEuaW5zZXJ0KCBwYWlyPGludCwgaW50PigxMSwgLTEpICk7CiAgICBtMS5pbnNlcnQoIHBhaXI8aW50LCBpbnQ+KDE2LCAtMSkgKTsKICAgIG0xLmluc2VydCggcGFpcjxpbnQsIGludD4oMjEsIC0xKSApOwoKICAgIGR1bXBPdXQ8IG1hcDxpbnQsIGludD4gPiggbTEgKTsKCiAgICByZXR1cm4gMDsKfQo=