| 103 | |
| 104 | template <typename ForwardIterator> |
| 105 | ForwardIterator cmRemoveDuplicates(ForwardIterator first, ForwardIterator last) |
| 106 | { |
| 107 | using Value = typename std::iterator_traits<ForwardIterator>::value_type; |
| 108 | struct Hash |
| 109 | { |
| 110 | std::size_t operator()(ForwardIterator it) const |
| 111 | { |
| 112 | return std::hash<Value>{}(*it); |
| 113 | } |
| 114 | }; |
| 115 | |
| 116 | struct Equal |
| 117 | { |
| 118 | bool operator()(ForwardIterator it1, ForwardIterator it2) const |
| 119 | { |
| 120 | return *it1 == *it2; |
| 121 | } |
| 122 | }; |
| 123 | std::unordered_set<ForwardIterator, Hash, Equal> uniq; |
| 124 | |
| 125 | ForwardIterator result = first; |
| 126 | while (first != last) { |
| 127 | if (!cm::contains(uniq, first)) { |
| 128 | if (result != first) { |
| 129 | *result = std::move(*first); |
| 130 | } |
| 131 | uniq.insert(result); |
| 132 | ++result; |
| 133 | } |
| 134 | ++first; |
| 135 | } |
| 136 | return result; |
| 137 | } |
| 138 | |
| 139 | template <typename Range> |
| 140 | typename Range::iterator cmRemoveDuplicates(Range& r) |
searching dependent graphs…