如何获取 std::set 中给定下限和上限的映射中的一系列值?

use*_*759 5 c++ containers std set

假设我有以下代码

#include <iostream>
#include <set>

int main ()
{
  std::set<int> myset;
  int inf, sup;

  inf = 25; sup = 60;
  for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚标准库是否提供了任何方法或方法组合,可以让我获得两个迭代器,it_l, it_u从而覆盖范围 [inf,sup]。我尝试过使用 lower_bound、upper_bound 但我误解了它们的工作原理。这个想法是避免编写循环(因为我知道我可以为此任务编写自己的函数,但也许有一些我不知道的替代方案)。

更新:预期输出的一些示例是(在我的示例中)

inf =25; sup = 60我预计{30,40,50,60}

如果相反

inf=30; sup = 60我预计{30,40,50,60}

如果

inf=25; sup = 65我预计{30,40,50,60}

显然这是一个误解,或者也许是我没有正确表达我想做的事情。

当我说 inf 和sup 时,请将它们视为实区间的极值。一旦做出这样的假设,我想要检索的是区间 [inf,sup] 和由集合对象指定的离散集合之间的交集。我刚才说的和我举的例子是不是有些矛盾?

A={10 20 30 40 50 60 70 80 90}B1=[25,60]B2=[30,60]B3=[25,65]

对于每个 和i=1,2,3之间的交集ABi准确地给出了我在示例中所说的内容。

min*_*iot 4

这对我来说效果很好:

#include <iostream>
#include <set>

template <typename T>
std::pair<typename std::set<T>::const_iterator, typename std::set<T>::const_iterator>
infsup(const std::set<T>& set, const T& inf, const T& sup)
{
  return std::make_pair(set.lower_bound(inf), set.upper_bound(sup));
}

int main ()
{
  std::set<int> myset;
  int inf, sup;

  for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90

  for (auto its = infsup(myset, 30, 60); its.first != its.second; ++its.first)
  {
    std::cout << " " << *its.first; // 30 40 50 60
  }
  std::cout << std::endl;

  for (auto its = infsup(myset, 25, 65); its.first != its.second; ++its.first)
  {
    std::cout << " " << *its.first; // 30 40 50 60
  }
  std::cout << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用lower_boundforinf意味着起始迭代器将指向不小于的第一个元素inf,因此满足您想要的范围下限的条件。

使用 upper_boundforsup意味着结束迭代器将指向 _ 第一个大于sup_ 的元素。请注意,C++ 中的结束迭代器始终指向范围的末尾,因此sup将被包含在内。

编辑以反映评论中的讨论(感谢@Useless指出):请注意,这适用于空结果范围,例如

  • 当 和infsup小于集合中的最小元素时
  • 当两者都大于最大元素时
  • 当 [inf,sup] 中没有元素时(在您的示例中,比如说inf=25, sup=29

但是,如果您选择inf > sup使返回的迭代器引用不同的元素,则its.first > its.second,这将使for循环(正如我上面所写的那样)失败。因此,您需要确保这一点inf <= sup(就像您可能正在编写的任何其他循环一样for)。