我需要获得C ++中容器元素的等级(位置索引+ 1),如vector
或list
。有没有方便的方法呢?我可以根据nth_element
进行测试以找到排名。或者我可以排序并进行二分搜索以找到排名。但在最坏的情况下,所有这些似乎都不是很有效。我希望得到O(lgn)的复杂性,并尽可能使用STL算法。
答案 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)除以一个元素的大小
这应该给你位置(或等级)。
这是假设元素是固定大小的。