STL: distance, unique
看remove duplicates from sorted array,发现如果用STL的话可以一句话搞定,如下:
class Solution { public: int removeDuplicates(int A[], int n) { return distance(A, unique(A, A + n)); } };
去cplusplus.com上查了unique和distance的用法,如下:
unique:
equality (1) template <class ForwardIterator> ForwardIterator unique (ForwardIterator first, ForwardIterator last);predicate (2) template <class ForwardIterator, class BinaryPredicate> ForwardIterator unique (ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
去除数组中存在连续的重复的元素,只保留第一个。方法返回an iterator to the element that follows the last element not removed(表达能力拙计,直接上英文原话吧)。
也可以自定义predicate,相当于自己写remove的规则。
一个例子如下:
/ unique algorithm example #include <iostream> // std::cout #include <algorithm> // std::unique, std::distance #include <vector> // std::vector bool myfunction (int i, int j) { return (i==j); } int main () { int myints[] = {10,20,20,20,30,30,20,20,10}; // 10 20 20 20 30 30 20 20 10 std::vector<int> myvector (myints,myints+9); // using default comparison: std::vector<int>::iterator it; it = std::unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 ? ? ? ? // ^ myvector.resize( std::distance(myvector.begin(),it) ); // 10 20 30 20 10 // using predicate comparison: std::unique (myvector.begin(), myvector.end(), myfunction); // (no changes) // print out content: std::cout << "myvector contains:"; for (it=myvector.begin(); it!=myvector.end(); ++it) std::cout << ' ' << *it; std::cout << '\n'; return 0; }
distance:
template<class InputIterator> typename iterator_traits<InputIterator>::difference_type distance (InputIterator first, InputIterator last);
就是返回两个迭代器之间的距离。
回到一开始leetcode的那个例子,因为unique返回的是the iterator to the element which follow the last element,所以一头一尾直接算出了去除重复元素之后的数组的长度。