出于可读性的考虑,我避免在复杂代码中使用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_range
和lower_bound
/upper_bound
对可能的不同实现(不同的性能,等等),并专注于结构化捆绑使用,这是平等的,无论是从条款的表示在编译代码和性能?我不是问编译器会做什么.我的问题只是,如果我正确地使用该工具,我可以期待类似的结果?或者有什么区别,或者更糟的是,陷阱?
我错过什么了吗?还是这一切都很好?
1条答案
按热度按时间a14dhokn1#
字符串
这是非常安全,有效的,是推荐的方法。
与像您展示的那样搜索
lower_bound
和upper_bound
的整个范围相比,它也有可能更有效。为了解释最后一个语句,您对上限的搜索包括范围
[my_array.begin(), it_lower)
,在大多数情况下,这将导致比必要的更多的比较。上界的搜索应该使用
it_lower
作为 first 迭代器来排除已经被std::lower_bound
排除的范围:型