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之间的交集A,Bi准确地给出了我在示例中所说的内容。
这对我来说效果很好:
#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指出):请注意,这适用于空结果范围,例如
inf都sup小于集合中的最小元素时inf=25, sup=29)但是,如果您选择inf > sup使返回的迭代器引用不同的元素,则its.first > its.second,这将使for循环(正如我上面所写的那样)失败。因此,您需要确保这一点inf <= sup(就像您可能正在编写的任何其他循环一样for)。
| 归档时间: |
|
| 查看次数: |
2247 次 |
| 最近记录: |