重複した数/してない数

ちょっと必要になったのでサクっと作ってみました。
わざわざ作るまでもなかったかな・・・


template 
inline size_t overlap_count(FwdIter first, FwdIter last)
{
    return std::distance(std::unique(first, last), last);
}

template 
inline size_t overlap_count(FwdIter first, FwdIter last, Pred pred)
{
    return std::distance(std::unique(first, last, pred), last);
}


template 
inline size_t unique_count(FwdIter first, FwdIter last)
{
    return std::distance(first, std::unique(first, last));
}

template 
inline size_t unique_count(FwdIter first, FwdIter last, Pred pred)
{
    return std::distance(first, std::unique(first, last, pred));
}

template <class FwdIter>
inline size_t unique_count(FwdIter first, FwdIter last)
{
    std::vector<typename FwdIter::value_type> uni;

    std::unique_copy(first, last, std::back_inserter(uni));

    return uni.size();
}

template <class FwdIter, class Pred>
inline size_t unique_count(FwdIter first, FwdIter last, Pred pred)
{
    std::vector<typename FwdIter::value_type> uni;

    std::unique_copy(first, last, std::back_inserter(uni), pred);

    return uni.size();
}
template <class FwdIter>
inline size_t overlap_count(FwdIter first, FwdIter last)
{
    return std::distance(first, last) - unique_count(first, last);
}

template <class FwdIter, class Pred>
inline size_t overlap_count(FwdIter first, FwdIter last, Pred pred)
{
    return std::distance(first, last) - unique_count(first, last, pred);
}
#include <vector>
#include <shand/algorithm.h>

using namespace std;
using namespace shand;

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());

    // 重複してない数取得...2
    size_t unique_cnt = unique_count(v.begin(), v.end());

    return 0;
}


「重複してない数」って日本語ヘンかなー

ユニークな値の数です



2007/10/04 更新...バグってたので修正


ライブラリまとめ