#include <algorithm> template <class InputIterator, class OutputIterator> OutputIterator unique_copy(Inputiterator first, InputIterator last, OutputIterator result); template <class InputIterator, class OutputIterator, class BinaryPredicate> Outputiterator unique_copy(Inputiterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
#include <stdio.h> #include <cmath> #include <vector> #include <algorithm> using namespace std; // 誤差の範囲で同じか否かのチェック class Equal : public binary_function<double, double, bool> { public: result_type operator() (first_argument_type a, second_argument_type b) { return (result_type)((abs(a-b) < 0.1) ? 1 : 0); } }; int main() { // 初期設定 vector<double> v1 {4.1, 4.95, 5.0, 8.0, 5.0, 5.0, 7.0}; printf("v1 :"); for (auto x : v1) printf(" %f", x); printf("\n"); vector<double> v2; copy(v1.begin(), v1.end(), inserter(v2, v2.begin())); // inserter 参照 printf("v2 :"); for (auto x : v2) printf(" %f", x); printf("\n"); // v1 の隣り合った重複要素を削除 printf("v1 の隣り合った重複要素を削除\n"); vector<double>::iterator it, end; end = unique(v1.begin(), v1.end()); // 注意 printf(" v1(end) :"); for (it = v1.begin(); it != end; it++) printf(" %f", *it); printf("\n"); printf(" v1 :"); for (auto x : v1) printf(" %f", x); printf("\n size of v1 = %d (注意)\n", v1.size()); // 初期設定後,v1 の隣り合った重複要素を削除(述語使用) printf("初期設定後,v1 の重複要素を削除(述語使用)\n"); v1.clear(); copy(v2.begin(), v2.end(), inserter(v1, v1.begin())); end = unique(v1.begin(), v1.end(), Equal()); // 注意,二項関数オブジェクト // end = unique(v1.begin(), v1.end(), [](int a, int b){ return abs(a-b) < 0.1; }); // 注意,ラムダ式 printf(" v1(end) :"); for (it = v1.begin(); it != end; it++) printf(" %f", *it); printf("\n"); printf(" v1 :"); for (auto x : v1) printf(" %f", x); printf("\n size of v1 = %d (注意)\n", v1.size()); // 初期設定後,v1 の隣り合った重複要素を削除し,v2 にコピー printf("初期設定後,v1 の隣り合った重複要素を削除し,v2 にコピー\n"); v1.clear(); copy(v2.begin(), v2.end(), inserter(v1, v1.begin())); unique_copy(v1.begin(), v1.end(), v2.begin()); printf(" v1 :"); for (auto x : v1) printf(" %f", x); printf("\n"); printf(" v2 :"); for (auto x : v2) printf(" %f", x); printf("\n"); // v1 の隣り合った重複要素を削除し,v2 にコピー(述語使用) printf("v1 の隣り合った重複要素を削除し,v2 にコピー(述語使用)\n"); unique_copy(v1.begin(), v1.end(), v2.begin(), Equal()); printf(" v1 :"); for (auto x : v1) printf(" %f", x); printf("\n"); printf(" v2 :"); for (auto x : v2) printf(" %f", x); printf("\n"); return 0; }
v1 : 4.100000 4.950000 5.000000 8.000000 5.000000 5.000000 7.000000 v2 : 4.100000 4.950000 5.000000 8.000000 5.000000 5.000000 7.000000 v1 の隣り合った重複要素を削除 v1(end) : 4.100000 4.950000 5.000000 8.000000 5.000000 7.000000 v1 : 4.100000 4.950000 5.000000 8.000000 5.000000 7.000000 7.000000 size of v1 = 7 (注意) 初期設定後,v1 の重複要素を削除(述語使用) v1(end) : 4.100000 4.950000 8.000000 5.000000 7.000000 v1 : 4.100000 4.950000 8.000000 5.000000 7.000000 5.000000 7.000000 size of v1 = 7 (注意) 初期設定後,v1 の隣り合った重複要素を削除し,v2 にコピー v1 : 4.100000 4.950000 5.000000 8.000000 5.000000 5.000000 7.000000 v2 : 4.100000 4.950000 5.000000 8.000000 5.000000 7.000000 7.000000 v1 の隣り合った重複要素を削除し,v2 にコピー(述語使用) v1 : 4.100000 4.950000 5.000000 8.000000 5.000000 5.000000 7.000000 v2 : 4.100000 4.950000 8.000000 5.000000 7.000000 7.000000 7.000000
菅沼ホーム | 本文目次 | 演習問題解答例 | 付録目次 | 索引 |