#include <iostream>
#include <map>
#include <boost/iterator/transform_iterator.hpp>
using namespace std;
template<typename T, typename F>
struct map_adaptor
{
map_adaptor(const T& t, const F& f) : _t(t), _f(f)
{
}
map_adaptor(map_adaptor& a) = delete;
map_adaptor(map_adaptor &&a) = default;
auto begin()
{
return boost::make_transform_iterator(_t.begin(), _f);
}
auto end()
{
return boost::make_transform_iterator(_t.end(), _f);
}
protected:
const T& _t;
F _f;
};
template<typename T, typename F>
auto get_map_adaptor(const T& t, const F& f)
{
return map_adaptor<T, F>(t, f);
}
template<typename T>
auto get_keys(const T& t)
{
return get_map_adaptor(t, [](auto& p) { return p.first; });
}
template<typename T>
auto get_values(const T& t)
{
return get_map_adaptor(t, [](auto& p) { return p.second; });
}
int main() {
// your code goes here
map<string, int> m = { {"Foobar",1},{ "Foobar2",2 },{ "Foobar3",3 } };
for (auto&& i : get_keys(m))
cout << i << endl;
for (auto&& i : get_values(m))
cout << i << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8Ym9vc3QvaXRlcmF0b3IvdHJhbnNmb3JtX2l0ZXJhdG9yLmhwcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBGPgpzdHJ1Y3QgbWFwX2FkYXB0b3IKewoJbWFwX2FkYXB0b3IoY29uc3QgVCYgdCwgY29uc3QgRiYgZikgOiBfdCh0KSwgX2YoZikKCXsKCgl9CgltYXBfYWRhcHRvcihtYXBfYWRhcHRvciYgYSkgPSBkZWxldGU7CgltYXBfYWRhcHRvcihtYXBfYWRhcHRvciAmJmEpID0gZGVmYXVsdDsKCglhdXRvIGJlZ2luKCkKCXsKCQlyZXR1cm4gYm9vc3Q6Om1ha2VfdHJhbnNmb3JtX2l0ZXJhdG9yKF90LmJlZ2luKCksIF9mKTsKCX0KCglhdXRvIGVuZCgpCgl7CgkJcmV0dXJuIGJvb3N0OjptYWtlX3RyYW5zZm9ybV9pdGVyYXRvcihfdC5lbmQoKSwgX2YpOwoJfQoJCnByb3RlY3RlZDoKCWNvbnN0IFQmIF90OwoJRiBfZjsKfTsKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBGPgphdXRvIGdldF9tYXBfYWRhcHRvcihjb25zdCBUJiB0LCBjb25zdCBGJiBmKQp7CglyZXR1cm4gbWFwX2FkYXB0b3I8VCwgRj4odCwgZik7Cn0KCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgphdXRvIGdldF9rZXlzKGNvbnN0IFQmIHQpCnsKCXJldHVybiBnZXRfbWFwX2FkYXB0b3IodCwgW10oYXV0byYgcCkgeyByZXR1cm4gcC5maXJzdDsgfSk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmF1dG8gZ2V0X3ZhbHVlcyhjb25zdCBUJiB0KQp7CglyZXR1cm4gZ2V0X21hcF9hZGFwdG9yKHQsIFtdKGF1dG8mIHApIHsgcmV0dXJuIHAuc2Vjb25kOyB9KTsKfQoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCgltYXA8c3RyaW5nLCBpbnQ+IG0gPSB7IHsiRm9vYmFyIiwxfSx7ICJGb29iYXIyIiwyIH0seyAiRm9vYmFyMyIsMyB9IH07CgoJZm9yIChhdXRvJiYgaSA6IGdldF9rZXlzKG0pKQoJCWNvdXQgPDwgaSA8PCBlbmRsOwoKCWZvciAoYXV0byYmIGkgOiBnZXRfdmFsdWVzKG0pKQoJCWNvdXQgPDwgaSA8PCBlbmRsOwoJCglyZXR1cm4gMDsKfQ==