如何在C++中得到一个元素在向量中的秩
How to get the rank of an element in vector in C++
我需要为C++中的容器(如vector
或list
)获取元素的秩(位置索引+1)。有方便的方法吗?我本可以根据nth_element
进行测试,以找到排名。或者我可以排序并进行二进制搜索来找到排名。但在最坏的情况下,所有这些似乎都不是很有效。我想得到O(lgn)的复杂性,并尽可能使用STL算法。
如果您的容器具有随机访问迭代器(例如vector)并进行了排序,则可以使用std::lower_bound()
算法获得复杂度为O(logn)的元素索引。例如:
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) 用vector.begin()相减得到总内存
3) 除以一个元素的大小
这应该给你职位(或级别)。
这是假设元素是固定大小的。
相关文章:
- lower_bound()返回最后一个元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 访问 for_each 函数中的前一个元素
- 在 QListView 中显示最后一个元素
- 从 std::vector 中选择一个元素,而不是给定元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何从一个无序集合中获取一个元素