#include <iostream>
#include <set>
#include <functional>
struct HeavyObject {
HeavyObject(int x) : x{x} {}
HeavyObject(const HeavyObject& r) : x(r.x) { std::cout << "copy\n"; }
bool operator<(const HeavyObject& r) const
{
return x < r.x;
}
int x;
};
bool operator<(const std::reference_wrapper<const HeavyObject>& l, const std::reference_wrapper<const HeavyObject>& r)
{
return l.get().x < r.get().x;
}
std::ostream& operator<<(std::ostream& out, const HeavyObject& o)
{
return out << o.x;
}
template<typename T>
void func(std::set<T>& s)
{
for (auto& el : s) {
std::cout << el << " ";
}
}
int main()
{
std::set<HeavyObject> bigset;
for (int i = 0; i < 5; ++i) {
bigset.emplace(i);
}
auto newEnd = bigset.begin();
std::advance(newEnd, 3);
std::set<std::reference_wrapper<const HeavyObject>> c;
std::copy(bigset.begin(), newEnd, std::inserter(c, c.begin()));
func(c);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnN0cnVjdCBIZWF2eU9iamVjdCB7CiAgICBIZWF2eU9iamVjdChpbnQgeCkgOiB4e3h9IHt9CiAgICBIZWF2eU9iamVjdChjb25zdCBIZWF2eU9iamVjdCYgcikgOiB4KHIueCkgIHsgc3RkOjpjb3V0IDw8ICJjb3B5XG4iOyB9CiAgICAKICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEhlYXZ5T2JqZWN0JiByKSBjb25zdAogICAgewogICAgICAgIHJldHVybiB4IDwgci54OwogICAgfQogICAgCiAgICBpbnQgeDsKfTsKCmJvb2wgb3BlcmF0b3I8KGNvbnN0IHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgSGVhdnlPYmplY3Q+JiBsLCBjb25zdCBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IEhlYXZ5T2JqZWN0PiYgcikgCnsKCXJldHVybiBsLmdldCgpLnggPCByLmdldCgpLng7Cn0KICAgIAoKc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBIZWF2eU9iamVjdCYgbykKewoJcmV0dXJuIG91dCA8PCBvLng7Cn0KICAgIAoKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgZnVuYyhzdGQ6OnNldDxUPiYgcykKewogICAgZm9yIChhdXRvJiBlbCA6IHMpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgZWwgPDwgIiAiOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6c2V0PEhlYXZ5T2JqZWN0PiBiaWdzZXQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewogICAgICAgIGJpZ3NldC5lbXBsYWNlKGkpOwogICAgfQogICAgCiAgICBhdXRvIG5ld0VuZCA9IGJpZ3NldC5iZWdpbigpOwogICAgc3RkOjphZHZhbmNlKG5ld0VuZCwgMyk7CiAgICBzdGQ6OnNldDxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IEhlYXZ5T2JqZWN0Pj4gYzsKICAgIHN0ZDo6Y29weShiaWdzZXQuYmVnaW4oKSwgbmV3RW5kLCBzdGQ6Omluc2VydGVyKGMsIGMuYmVnaW4oKSkpOwogICAgZnVuYyhjKTsKfQo=