| 6116 | |
| 6117 | template<typename I> |
| 6118 | I unique(I begin, I end) |
| 6119 | { |
| 6120 | // fast skip head |
| 6121 | while (begin + 1 < end && *begin != *(begin + 1)) |
| 6122 | begin++; |
| 6123 | |
| 6124 | if (begin == end) |
| 6125 | return begin; |
| 6126 | |
| 6127 | // last written element |
| 6128 | I write = begin++; |
| 6129 | |
| 6130 | // merge unique elements |
| 6131 | while (begin != end) |
| 6132 | { |
| 6133 | if (*begin != *write) |
| 6134 | *++write = *begin++; |
| 6135 | else |
| 6136 | begin++; |
| 6137 | } |
| 6138 | |
| 6139 | // past-the-end (write points to live element) |
| 6140 | return write + 1; |
| 6141 | } |
| 6142 | |
| 6143 | template<typename I> |
| 6144 | void copy_backwards(I begin, I end, I target) |