#include <algorithm>
template <class FwdIter>
inline std::size_t overlap_count(FwdIter first, FwdIter last)
{
std::size_t count = 0;
FwdIter cur = first;
while ((cur = std::adjacent_find(cur, last)) != last) { ++count; ++cur; }
return count;
}
template <class FwdIter, class Pred>
inline std::size_t overlap_count(FwdIter first, FwdIter last, Pred pred)
{
std::size_t count = 0;
FwdIter cur = first;
while ((cur = std::adjacent_find(cur, last), pred) != last) { ++count; ++cur; }
return count;
}
template <class FwdIter>
inline std::size_t unique_count(FwdIter first, FwdIter last)
{
return std::distance(first, last) - overlap_count(first, last);
}
template <class FwdIter, class Pred>
inline std::size_t unique_count(FwdIter first, FwdIter last, Pred pred)
{
return std::distance(first, last) - overlap_count(first, last, pred);
}
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
vector<int> v;
v.push_back(3);
v.push_back(1);
v.push_back(3);
v.push_back(3);
v.push_back(1);
// ソート済みである必要がある
sort(v.begin(), v.end());
// 重複数取得...3
size_t overlap_cnt = overlap_count(v.begin(), v.end());
cout << overlap_cnt << endl;
// 重複してない数取得...2
size_t unique_cnt = unique_count(v.begin(), v.end());
cout << unique_cnt << endl;
return 0;
}