#include <iostream>
#include <string>
#include <tuple>
#include <list>
#include <set>
class Example
{
std::string one, two, three, four, five;
public:
Example(const std::string& a_one, const std::string& a_two,
const std::string& a_three,
const std::string& a_four, const std::string& a_five) :
one(a_one),two(a_two),three(a_three),four(a_four),five(a_five)
{}
bool operator < (const Example& other) const
{
return std::tie(one, two, three, four, five)
< std::tie(other.one, other.two, other.three, other.four,
other.five);
}
friend std::ostream& operator<<(std::ostream& os, const Example& e) {
return os << "[" << e.one << "," << e.two << "," << e.three << "," << e.four << "," << e.five << "]";
}
};
std::list<Example> GetExamples()
{
std::list<Example> result;
result.push_back(Example("duplicate", "a", "a", "a", "a"));
result.push_back(Example("unique", "2", "4", "0", "0"));
result.push_back(Example("duplicate", "a", "a", "a", "a"));
result.push_back(Example("unique", "2", "3", "4", "5"));
return result;
}
void CountExample(const Example& example, std::multiset<Example>& counters)
{
counters.insert(example);
}
void PrintCounters(const std::multiset<Example>& counters)
{
for(auto i=counters.begin(); i!=counters.end(); i = counters.upper_bound(*i))
std::cout << *i << ":" << counters.count(*i) << '\n';
}
int main()
{
std::multiset<Example> counters;
std::list<Example> examples = GetExamples();
std::list<Example>::const_iterator Iter;
for (Iter = examples.begin(); Iter != examples.end();Iter++)
{
CountExample(*Iter, counters);
}
PrintCounters(counters);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxsaXN0PgojaW5jbHVkZSA8c2V0PgpjbGFzcyBFeGFtcGxlCnsKICAgIHN0ZDo6c3RyaW5nIG9uZSwgdHdvLCB0aHJlZSwgZm91ciwgZml2ZTsKcHVibGljOgogICAgRXhhbXBsZShjb25zdCBzdGQ6OnN0cmluZyYgYV9vbmUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhX3R3bywKICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFfdGhyZWUsCiAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhX2ZvdXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhX2ZpdmUpIDoKICAgICAgICBvbmUoYV9vbmUpLHR3byhhX3R3byksdGhyZWUoYV90aHJlZSksZm91cihhX2ZvdXIpLGZpdmUoYV9maXZlKQogICAgICAgIHt9CiAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEV4YW1wbGUmIG90aGVyKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBzdGQ6OnRpZShvbmUsIHR3bywgdGhyZWUsIGZvdXIsIGZpdmUpCiAgICAgICAgICAgICA8IHN0ZDo6dGllKG90aGVyLm9uZSwgb3RoZXIudHdvLCBvdGhlci50aHJlZSwgb3RoZXIuZm91ciwKICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuZml2ZSk7CiAgICB9CiAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEV4YW1wbGUmIGUpIHsKICAgICAgICByZXR1cm4gb3MgPDwgIlsiIDw8IGUub25lIDw8ICIsIiA8PCBlLnR3byA8PCAiLCIgPDwgZS50aHJlZSA8PCAiLCIgPDwgZS5mb3VyIDw8ICIsIiA8PCBlLmZpdmUgPDwgIl0iOwogICAgfQp9OwoKCnN0ZDo6bGlzdDxFeGFtcGxlPiBHZXRFeGFtcGxlcygpCnsKICAgIHN0ZDo6bGlzdDxFeGFtcGxlPiByZXN1bHQ7CiAgICByZXN1bHQucHVzaF9iYWNrKEV4YW1wbGUoImR1cGxpY2F0ZSIsICJhIiwgImEiLCAiYSIsICJhIikpOwogICAgcmVzdWx0LnB1c2hfYmFjayhFeGFtcGxlKCJ1bmlxdWUiLCAiMiIsICI0IiwgIjAiLCAiMCIpKTsKICAgIHJlc3VsdC5wdXNoX2JhY2soRXhhbXBsZSgiZHVwbGljYXRlIiwgImEiLCAiYSIsICJhIiwgImEiKSk7CiAgICByZXN1bHQucHVzaF9iYWNrKEV4YW1wbGUoInVuaXF1ZSIsICIyIiwgIjMiLCAiNCIsICI1IikpOwogICAgcmV0dXJuIHJlc3VsdDsKfQp2b2lkIENvdW50RXhhbXBsZShjb25zdCBFeGFtcGxlJiBleGFtcGxlLCBzdGQ6Om11bHRpc2V0PEV4YW1wbGU+JiBjb3VudGVycykKewogICAgY291bnRlcnMuaW5zZXJ0KGV4YW1wbGUpOwp9Cgp2b2lkIFByaW50Q291bnRlcnMoY29uc3Qgc3RkOjptdWx0aXNldDxFeGFtcGxlPiYgY291bnRlcnMpCnsKICAgIGZvcihhdXRvIGk9Y291bnRlcnMuYmVnaW4oKTsgaSE9Y291bnRlcnMuZW5kKCk7IGkgPSBjb3VudGVycy51cHBlcl9ib3VuZCgqaSkpCiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAqaSA8PCAiOiIgPDwgY291bnRlcnMuY291bnQoKmkpIDw8ICdcbic7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjptdWx0aXNldDxFeGFtcGxlPiBjb3VudGVyczsKICAgIHN0ZDo6bGlzdDxFeGFtcGxlPiBleGFtcGxlcyA9IEdldEV4YW1wbGVzKCk7CiAgICBzdGQ6Omxpc3Q8RXhhbXBsZT46OmNvbnN0X2l0ZXJhdG9yIEl0ZXI7CiAgICBmb3IgKEl0ZXIgPSBleGFtcGxlcy5iZWdpbigpOyBJdGVyICE9IGV4YW1wbGVzLmVuZCgpO0l0ZXIrKykKICAgIHsKICAgICAgICBDb3VudEV4YW1wbGUoKkl0ZXIsIGNvdW50ZXJzKTsKICAgIH0KICAgIFByaW50Q291bnRlcnMoY291bnRlcnMpOwp9Cg==