c++ 使用结构化绑定声明解包std::equal_range的结果

kt06eoxx  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(123)

出于可读性的考虑,我避免在复杂代码中使用std::pair,以保持变量名称的意义。
考虑到std::equal_range返回迭代器的std::pair,使用structured binding以这种方式解包迭代器是否有效和安全:
而不是

auto it_lower = std::lower_bound(my_array.begin(), my_array.end(), val, comparator);
auto it_upper = std::upper_bound(my_array.begin(), my_array.end(), val, comparator);

字符串
使用

auto [it_lower, it_upper] = std::equal_range(my_array.begin(), my_array.end(), val, comparator);


接近?
忘记equal_rangelower_bound/upper_bound对可能的不同实现(不同的性能,等等),并专注于结构化捆绑使用,这是平等的,无论是从条款的表示在编译代码和性能?我不是问编译器会做什么.我的问题只是,如果我正确地使用该工具,我可以期待类似的结果?或者有什么区别,或者更糟的是,陷阱?
我错过什么了吗?还是这一切都很好?

a14dhokn

a14dhokn1#

auto [it_lower, it_upper] = std::equal_range(...

字符串
这是非常安全,有效的,是推荐的方法。
与像您展示的那样搜索lower_boundupper_bound的整个范围相比,它也有可能更有效。
为了解释最后一个语句,您对上限的搜索包括范围[my_array.begin(), it_lower),在大多数情况下,这将导致比必要的更多的比较。
上界的搜索应该使用it_lower作为 first 迭代器来排除已经被std::lower_bound排除的范围:

auto it_lower = std::lower_bound(my_array.begin(), my_array.end(), val, comparator);
auto it_upper = std::upper_bound(it_lower, my_array.end(), val, comparator);
//                               ^^^^^^^^

相关问题