提问人:Damir Tenishev 提问时间:11/11/2023 最后编辑:Damir Tenishev 更新时间:11/11/2023 访问量:70
使用结构化绑定声明解压缩 std::equal_range 的结果
Using structured binding declaration for unpacking the result of std::equal_range
问:
出于可读性考虑,我避免对复杂代码使用 std::p air 以保持变量名称有意义。
考虑到 std::equal_range 返回迭代器,使用结构化绑定以这种方式解压缩迭代器是否有效且安全:std::pair
而不是
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
我错过了什么还是这完全没问题?
答:
6赞
Ted Lyngmo
11/11/2023
#1
auto [it_lower, it_upper] = std::equal_range(...
这是完全安全、有效的,并且是推荐的方法。
与搜索整个范围相比,就像你所展示的那样,它也有可能更有效。lower_bound
upper_bound
为了解释最后一种说法,您对上限的搜索包括范围,在大多数情况下,该范围将导致不必要的比较。[my_array.begin(), it_lower)
对上限的搜索应用作第一个迭代器,以排除已由 以下 排除的范围:it_lower
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);
// ^^^^^^^^
评论
0赞
Damir Tenishev
11/11/2023
谢谢。澄清一下,我说得对吗,这将像第一个代码片段一样具有初始化语义,而不是赋值?当然,在这种简单的情况下,这是无关紧要的,即使在赋值的情况下也可以留给编译器。但在更棘手的情况下,最好确保这是初始化,而不是赋值。
1赞
Ted Lyngmo
11/11/2023
@DamirTenishev 它是初始化 - 而且,迭代器应该是轻量级的,所以即使它们未初始化然后移动分配,它也会有效
0赞
Damir Tenishev
11/11/2023
关于你对使用尽可能优化的评论,你会笑的,但就在这个问题前一个小时,我发布了这个问题 stackoverflow.com/questions/77461666/...,所以我知道这一点。就像 en.cppreference.com 一样,我的想法是提供最简单的代码,以避免分散问题主题的注意力。无论如何,感谢您的添加,这让我对这个简单的优化充满信心。it_lower
评论