#include <iostream>
#include <list>
#include <queue>
#include <vector>
struct Foo {
Foo(int _a) : a(_a) {}
int a;
};
struct FooComparator {
bool operator()(Foo *a, Foo *b) { return a->a < b->a; }
};
int main() {
std::list<Foo> foos;
//std::vector<Foo> foos; // when used instead, the behaviour will become undefined
std::priority_queue<Foo *, std::vector<Foo *>, FooComparator> pq;
// Simulate creation and 'containment' of objects, while they are being processed by other structures.
for(int i=0; i<100; ++i) {
foos.push_back(Foo((100-i) % 10));
pq.emplace(&foos.back());
}
while(not pq.empty()) {
std::cout << pq.top()->a << " "; // the dereference -> may segfault if foos is not *pointer stable*
pq.pop();
}
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IEZvbyB7CglGb28oaW50IF9hKSA6IGEoX2EpIHt9CglpbnQgYTsKfTsKCnN0cnVjdCBGb29Db21wYXJhdG9yIHsKCWJvb2wgb3BlcmF0b3IoKShGb28gKmEsIEZvbyAqYikgeyByZXR1cm4gYS0+YSA8IGItPmE7IH0KfTsKCmludCBtYWluKCkgewoJc3RkOjpsaXN0PEZvbz4gZm9vczsKCS8vc3RkOjp2ZWN0b3I8Rm9vPiBmb29zOyAvLyB3aGVuIHVzZWQgaW5zdGVhZCwgdGhlIGJlaGF2aW91ciB3aWxsIGJlY29tZSB1bmRlZmluZWQKCXN0ZDo6cHJpb3JpdHlfcXVldWU8Rm9vICosIHN0ZDo6dmVjdG9yPEZvbyAqPiwgRm9vQ29tcGFyYXRvcj4gcHE7CgkKCS8vIFNpbXVsYXRlIGNyZWF0aW9uIGFuZCAnY29udGFpbm1lbnQnIG9mIG9iamVjdHMsIHdoaWxlIHRoZXkgYXJlIGJlaW5nIHByb2Nlc3NlZCBieSBvdGhlciBzdHJ1Y3R1cmVzLgoJZm9yKGludCBpPTA7IGk8MTAwOyArK2kpIHsKCQlmb29zLnB1c2hfYmFjayhGb28oKDEwMC1pKSAlIDEwKSk7CgkJcHEuZW1wbGFjZSgmZm9vcy5iYWNrKCkpOwoJfQoJCgl3aGlsZShub3QgcHEuZW1wdHkoKSkgewoJCXN0ZDo6Y291dCA8PCBwcS50b3AoKS0+YSA8PCAiICI7IC8vIHRoZSBkZXJlZmVyZW5jZSAtPiBtYXkgc2VnZmF1bHQgaWYgZm9vcyBpcyBub3QgKnBvaW50ZXIgc3RhYmxlKgoJCXBxLnBvcCgpOwoJfQoJCglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0=