如何在C ++中获取向量中元素的等级

时间:2012-01-19 00:26:38

标签: c++ stl

我需要获得C ++中容器元素的等级(位置索引+ 1),如vectorlist。有没有方便的方法呢?我可以根据nth_element进行测试以找到排名。或者我可以排序并进行二分搜索以找到排名。但在最坏的情况下,所有这些似乎都不是很有效。我希望得到O(lgn)的复杂性,并尽可能使用STL算法。

3 个答案:

答案 0 :(得分:4)

如果您的容器具有随机访问迭代器(例如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语法来保持代码简短,但你应该明白这一点。)

请注意,您可以按排序方式向元素插入元素,因此在查找索引之前无需进行排序。

答案 1 :(得分:2)

你似乎不太可能在这里找到比线性搜索更有效的东西。最糟糕的情况必然是你将所有元素与你搜索的内容进行比较 - 这正是线性搜索给你的。

答案 2 :(得分:0)

这可能是不整洁的。

你可以使用向量中的元素在内存中连续的事实。

所以你需要做的是

1)获取感兴趣元素的迭代器地址

2)用vector.begin()减去总内存

3)除以一个元素的大小

这应该给你位置(或等级)。

这是假设元素是固定大小的。