使用结构化绑定声明解压缩 std::equal_range 的结果

Using structured binding declaration for unpacking the result of std::equal_range

提问人:Damir Tenishev 提问时间:11/11/2023 最后编辑:Damir Tenishev 更新时间:11/11/2023 访问量:70

问:

出于可读性考虑,我避免对复杂代码使用 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_rangelower_boundupper_bound

我错过了什么还是这完全没问题?

C++ STL

评论


答:

6赞 Ted Lyngmo 11/11/2023 #1
auto [it_lower, it_upper] = std::equal_range(...

这是完全安全、有效的,并且是推荐的方法。

与搜索整个范围相比,就像你所展示的那样,它也有可能更有效。lower_boundupper_bound


为了解释最后一种说法,您对上限的搜索包括范围,在大多数情况下,该范围将导致不必要的比较。[my_array.begin(), it_lower)

对上限的搜索应用作第一个迭代器,以排除已由 以下 排除的范围:it_lowerstd::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