ちょっと必要になったのでサクっと作ってみました。
わざわざ作るまでもなかったかな・・・
templateinline 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); }
templateinline 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 更新...バグってたので修正