我需要在C++中获取像vector
或list
这样的容器中元素的排名(即位置索引+1)。有没有一种方便的方法来实现?我可以通过nth_element
进行基于测试来找到排名,或者排序并进行二分查找来寻找排名。但是这些方法在最坏情况下似乎都不是很高效。如果可能的话,我希望能够使用STL算法实现O(lgn)复杂度。
如果你的容器有随机访问迭代器(例如vector)且已排序,可以使用std::lower_bound()
算法在O(log n)复杂度内获取元素的索引。例如:
std::vector<int> v({10,20,30,30,20,10,10,20});
std::sort(v.begin(), v.end());
auto iter = std::lower_bound(v.begin(), v.end(), 20);
std::cout << "index " << int(iter - v.begin()) << std::endl;
我使用C++11语法使代码更短,但是您应该能够理解。
请注意,您可以以排序的方式向向量中插入元素,因此在查找索引之前无需先进行排序。
vector
已排序,这是此算法的更好用例(您将获得O(log n)插入和O(log n)搜索,而不是O(1)插入和O(n)搜索)。 - drrlvn在这里,你很难找到比线性搜索更有效的方法。最坏情况必须是您将所有元素与您要搜索的内容进行比较 - 这正是线性搜索所提供的。
这可能有点凌乱。
你可以利用向量中的元素在内存中是连续的这一事实。
所以你需要做的是:
1)获取感兴趣元素的迭代器地址
2)用vector.begin()减去它以获得总内存
3)除以一个元素的大小
这应该给你位置(或等级)。
这是假设元素是固定大小的情况下。
std::distance()
而不是相减)。 - underscore_d
std::set
而不是std::vector
或std::list
。 - penelope