#include <iostream>
#include <vector>
#include <algorithm>
struct Object {
size_t id;
size_t state;
} ;
struct LessByAllFields {
bool operator( ) ( const Object & first, const Object & second) {
if ( first.id == second.id ) {
return first.state < second.state ;
}
return first.id < second.id ;
}
} ;
struct LessById {
bool operator( ) ( const Object & first, const Object & second) {
return first.id < second.id ;
}
} ;
std:: ostream & operator<< ( std:: ostream & out, const Object & obj) {
return out << "id " << obj.id << " state " << obj.state << ' ' ;
}
std:: ostream & operator<< ( std:: ostream & out,
const std:: vector < Object> & objects) {
for ( auto object : objects) {
out << object << ' ' ;
}
return out << '\n ' ;
}
template < typename Comp>
std:: vector < Object> UniqueInFirst( const std:: vector < Object> & first,
const std:: vector < Object> & second,
Comp comp) {
std:: vector < Object> unique_in_first;
std:: set_difference ( second.begin ( ) , second.end ( ) , first.begin ( ) , first.end ( ) ,
std:: back_inserter ( unique_in_first) , comp) ;
return unique_in_first;
}
template < typename Comp>
std:: vector < Object> Intersection( const std:: vector < Object> & first,
const std:: vector < Object> & second, Comp comp) {
std:: vector < Object> unique_in_first;
std:: set_intersection ( first.begin ( ) , first.end ( ) , second.begin ( ) ,
second.end ( ) , std:: back_inserter ( unique_in_first) ,
comp) ;
return unique_in_first;
}
int main( ) {
std:: vector < Object> old = { { 0 , 0 } , { 1 , 1 } , { 2 , 2 } , { 3 , 3 } } ;
std:: vector < Object> current = { { 4 , 4 } , { 0 , 0 } , { 2 , 3 } , { 3 , 5 } } ;
std:: sort ( old.begin ( ) , old.end ( ) , LessByAllFields( ) ) ;
std:: sort ( current.begin ( ) , current.end ( ) , LessByAllFields( ) ) ;
std:: cout << "Old vector : " << old;
std:: cout << "Current vector : " << current;
std:: cout << "Only new elements : " << UniqueInFirst( old, current,
LessByAllFields( ) ) ;
std:: cout << "Only old elements : " << UniqueInFirst( current, old,
LessByAllFields( ) ) ;
std:: cout << "Same with state changed: \n "
<< "in old: " << Intersection( old, current, LessById( ) )
<< "in new: " << Intersection( current, old, LessById( ) ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKc3RydWN0IE9iamVjdCB7CiAgc2l6ZV90IGlkOwogIHNpemVfdCBzdGF0ZTsKfTsKCnN0cnVjdCBMZXNzQnlBbGxGaWVsZHMgewogIGJvb2wgb3BlcmF0b3IoKShjb25zdCBPYmplY3QgJmZpcnN0LCBjb25zdCBPYmplY3QgJnNlY29uZCkgewogICAgaWYgKGZpcnN0LmlkID09IHNlY29uZC5pZCkgewogICAgICByZXR1cm4gZmlyc3Quc3RhdGUgPCBzZWNvbmQuc3RhdGU7CiAgICB9CiAgICByZXR1cm4gZmlyc3QuaWQgPCBzZWNvbmQuaWQ7CiAgfQp9OwoKc3RydWN0IExlc3NCeUlkIHsKICBib29sIG9wZXJhdG9yKCkoY29uc3QgT2JqZWN0ICZmaXJzdCwgY29uc3QgT2JqZWN0ICZzZWNvbmQpIHsKICAgIHJldHVybiBmaXJzdC5pZCA8IHNlY29uZC5pZDsKICB9Cn07CgpzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvdXQsIGNvbnN0IE9iamVjdCAmb2JqKSB7CiAgcmV0dXJuIG91dCA8PCAiaWQgIiA8PCBvYmouaWQgPDwgIiBzdGF0ZSAiIDw8IG9iai5zdGF0ZSA8PCAnICc7Cn0KCnN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm91dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE9iamVjdD4gJm9iamVjdHMpIHsKICBmb3IgKGF1dG8gb2JqZWN0IDogb2JqZWN0cykgewogICAgb3V0IDw8IG9iamVjdCA8PCAnICc7CiAgfQogIHJldHVybiBvdXQgPDwgJ1xuJzsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbXA+CnN0ZDo6dmVjdG9yPE9iamVjdD4gVW5pcXVlSW5GaXJzdChjb25zdCBzdGQ6OnZlY3RvcjxPYmplY3Q+ICZmaXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE9iamVjdD4gJnNlY29uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXAgY29tcCkgewogIHN0ZDo6dmVjdG9yPE9iamVjdD4gdW5pcXVlX2luX2ZpcnN0OwogIHN0ZDo6c2V0X2RpZmZlcmVuY2Uoc2Vjb25kLmJlZ2luKCksIHNlY29uZC5lbmQoKSwgZmlyc3QuYmVnaW4oKSwgZmlyc3QuZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIodW5pcXVlX2luX2ZpcnN0KSwgY29tcCk7CiAgcmV0dXJuIHVuaXF1ZV9pbl9maXJzdDsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbXA+CnN0ZDo6dmVjdG9yPE9iamVjdD4gSW50ZXJzZWN0aW9uKGNvbnN0IHN0ZDo6dmVjdG9yPE9iamVjdD4gJmZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxPYmplY3Q+ICZzZWNvbmQsIENvbXAgY29tcCkgewogIHN0ZDo6dmVjdG9yPE9iamVjdD4gdW5pcXVlX2luX2ZpcnN0OwogIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihmaXJzdC5iZWdpbigpLCBmaXJzdC5lbmQoKSwgc2Vjb25kLmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZC5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHVuaXF1ZV9pbl9maXJzdCksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXApOwogIHJldHVybiB1bmlxdWVfaW5fZmlyc3Q7Cn0KCmludCBtYWluKCkgewogIHN0ZDo6dmVjdG9yPE9iamVjdD4gb2xkID0ge3swLCAwfSwgezEsIDF9LCB7MiwgMn0sIHszLCAzfX07CiAgc3RkOjp2ZWN0b3I8T2JqZWN0PiBjdXJyZW50ID0ge3s0LCA0fSwgezAsIDB9LCB7MiwgM30sIHszLCA1fX07CgogIHN0ZDo6c29ydChvbGQuYmVnaW4oKSwgb2xkLmVuZCgpLCBMZXNzQnlBbGxGaWVsZHMoKSk7CiAgc3RkOjpzb3J0KGN1cnJlbnQuYmVnaW4oKSwgY3VycmVudC5lbmQoKSwgTGVzc0J5QWxsRmllbGRzKCkpOwoKICBzdGQ6OmNvdXQgPDwgIk9sZCB2ZWN0b3IgICAgICAgICAgICAgOiAiIDw8IG9sZDsKICBzdGQ6OmNvdXQgPDwgIkN1cnJlbnQgdmVjdG9yICAgICAgICAgOiAiIDw8IGN1cnJlbnQ7CiAgc3RkOjpjb3V0IDw8ICJPbmx5IG5ldyBlbGVtZW50cyAgICAgIDogIiA8PCBVbmlxdWVJbkZpcnN0KG9sZCwgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVzc0J5QWxsRmllbGRzKCkpOwogIHN0ZDo6Y291dCA8PCAiT25seSBvbGQgZWxlbWVudHMgICAgICA6ICIgPDwgVW5pcXVlSW5GaXJzdChjdXJyZW50LCBvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlc3NCeUFsbEZpZWxkcygpKTsKICBzdGQ6OmNvdXQgPDwgIlNhbWUgd2l0aCBzdGF0ZSBjaGFuZ2VkOiBcbiIKICAgICAgICAgICAgPDwgImluIG9sZDogIiA8PCBJbnRlcnNlY3Rpb24ob2xkLCBjdXJyZW50LCBMZXNzQnlJZCgpKQogICAgICAgICAgICA8PCAiaW4gbmV3OiAiIDw8IEludGVyc2VjdGlvbihjdXJyZW50LCBvbGQsIExlc3NCeUlkKCkpOwp9Cg==