如何验证C ++中是否存在元素<x

时间:2018-08-28 17:11:23

标签: c++ iterator stdset lower-bound

在std :: set s中是否存在小于给定x的元素
如果不打印,则“ x小于任何元素”,然后打印“小于x的最大元素”。
顺便说一句,您还知道x不在集合中

是:

cin >> x;
auto it = s.lower_bound(x);  
it--;
if (it == s.begin()) 
    cout << "x is the smallest element in s\n"
else
    cout << *it;

好吗?

更多问题:

如果它= s.begin(),那么如果执行--it,它将是什么? 如果*这是集合中最小的元素,那么如果您--它将是什么?

2 个答案:

答案 0 :(得分:0)

lower_bound将返回一个迭代器,该迭代器指向小于x的所有元素,即指向大于或等于x的第一个元素。因此,如果它返回s.begin(),则所有元素都是> = x(没有一个更少)。因此,直接回答您的问题很好:

if (s.lower_bound(x) == s.begin())
    cout << "x is smaller than all elements of s";

答案 1 :(得分:0)

如果it是容器第一个元素的迭代器,则--it是Undefined Behavior,这意味着您应确保程序不执行此操作。如果程序执行了,则可能会发生任何事情,这是程序的错误,而不是编译器或库。

因此在不包含x的{​​{1}}中查找小于std::set s的最大元素的正确方法是:

x

(如果auto it = s.lower_bound(x); if (it == s.begin()) std::cout << x << " is smaller than all elements of s\n"; else std::cout << "The largest element in s smaller than " << x << " is " << *std::prev(it) << "\n"; 为空,这也是正确的:根本没有s的元素,因此没有小于s的元素,并且“小于{{ 1}}“是虚无的。)