业务中遇到一个问题,有一堆数据,我需要知道我这个数据在那一堆数据中排第几。
一般做法就是先把所有已知数据排序,再遍历找到我,那么就知道我是第几了。
这么做好吗?回答是:好。
那么请问是最好吗?不是最好。
std::sort 复杂度
std::partition 复杂度 ,O(n) ,n 为 last - first
std::distance 复杂度
想起了一个叫做std::partition的东东。http://en.cppreference.com/w/cpp/algorithm/partition
上测试代码:
test.cc
#include <algorithm>
#include <iostream>
template <class Type>
struct IsLess {
IsLess(const Type &pivot) : m_pivot(pivot) {}
bool operator()(const Type &other) const {
return other < m_pivot;
}
private:
Type m_pivot;
};
int main()
{
std::vector<int> vec;
vec.push_back(3);
vec.push_back(1);
vec.push_back(5);
vec.push_back(6);
vec.push_back(2);
vec.push_back(4);
std::vector<int>::iterator it = std::partition(vec.begin(), vec.end(), IsLess<int>(5));
int rank = std::distance(vec.begin(), it);
std::cout<<rank+1<<std::endl;
return 0;
}
$ g++ test.cc
$ ./a.out
$ 5
这样就知道数据5在这一堆数据中排第五。而容器中其他数据的相对位置我们不用关心。