获取std::map中lower_bound迭代器的前一个元素的高效方法
高效获取std::map lower_bound迭代器的前一个元素
嘿,你完全没必要遍历整个map来做这件事——std::map的迭代器是双向迭代器,天生支持直接向前移动的操作,这可比遍历的O(n)复杂度高效太多了,直接就能实现O(1)的操作!
具体实现步骤
- 先获取你的lower_bound迭代器:
std::map<unsigned int, char> m_map { std::make_pair(0, 'a'), std::make_pair(5, 'b'), std::make_pair(10, 'c'), std::make_pair(15, 'd') }; auto lower_bound_it = m_map.lower_bound(7); // 指向(10, 'c')
- 检查这个迭代器是否是map的起始位置(
begin()):如果是,说明没有前一个元素;如果不是,直接用std::prev()或者递减操作获取前一个元素的迭代器:
if (lower_bound_it != m_map.begin()) { // 用std::prev生成新的前向迭代器,不会修改原lower_bound_it auto prev_element_it = std::prev(lower_bound_it); // 现在prev_element_it指向(5, 'b') std::cout << "前一个元素:键=" << prev_element_it->first << ",值=" << prev_element_it->second << std::endl; } else { // 边界情况:lower_bound返回第一个元素,没有前一个元素 std::cout << "当前迭代器是第一个元素,不存在前一个元素" << std::endl; }
注意事项
- 如果你不需要保留原
lower_bound_it,也可以直接对它做递减操作:--lower_bound_it,但这样会改变原迭代器的指向,根据你的实际需求选择即可。 - 一定要先判断是否等于
begin(),否则对begin()做递减操作会导致未定义行为,程序可能崩溃或者出现异常结果。
内容的提问来源于stack exchange,提问作者Sumit Jha
相关产品推荐
相关产品推荐

