等値と等価とunique
- 等値(equality)
- a == b
- 等価(equivalence)
- !(a < b) && !(b < a)
任意の要素に対してこれらの結果が一致する場合、単にsetに入れていけばユニークな集合ができあがるが、異なる場合は std::unique を使う。
ただし、std::unique を使うには、等値である可能性があるものは必ずソートした状態で隣接していなければならない。
典型的なものとしては、doubleの誤差を考慮する場合がある。
struct Hoge { double a; bool operator<(const Hoge &x) const { return a < x.a; } bool operator==(const Hoge &x) const { return abs(a - x.a) < EPS; } };
std::unique の基本的な使い方
- sort する
- unique する
- erase する
vector<Hoge> v;
vector<Hoge>::iterator it;
...
sort(v.begin(), v.end());
it = unique(v.begin(), v.end());
cout << "unique numbers: " << distance(v.begin(), it) << endl;
v.erase(it, v.end());