[ create a new paste ] login | about

Link: http://codepad.org/XlHH1yG9    [ raw code | output | fork ]

C++, pasted on Feb 15:
#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;
}


Output:
1
2
3
2


Create a new paste based on this one


Comments: