C++ 设置,下界和上界是如何工作的?

C++ 设置,下界和上界是如何工作的?,c++,set,containers,C++,Set,Containers,我有一段简单的代码: #include <iostream> #include <set> using std::set; int main(int argc, char argv) { set<int> myset; set<int>::iterator it_l, it_u; myset.insert(10); it_l = myset.lower_bound(11); it_u = myset.upper_b

我有一段简单的代码:

#include <iostream>
#include <set>

using std::set;

int main(int argc, char argv) {
   set<int> myset;
   set<int>::iterator it_l, it_u;
   myset.insert(10);
   it_l = myset.lower_bound(11);
   it_u = myset.upper_bound(9);

   std::cout << *it_l << " " << *it_u << std::endl;
}
#包括
#包括
使用std::set;
int main(int argc、char argv){
设置myset;
set::迭代器it\u l,it\u;
myset.insert(10);
it_l=myset.下限(11);
it_=myset.上界(9);

std::cout这是UB。您的
it\u l=myset.lower\u bound(11);
返回
myset.end()
(因为它在集合中找不到任何内容),您不检查这些内容,然后基本上打印出结束迭代器之后的值。

std::set::lower\u bound开始:

返回值

指向不小于key的第一个元素的迭代器。如果找不到这样的元素,则返回一个超过结束迭代器(请参阅)

在您的情况下,由于集合中没有不小于(即大于或等于)11的元素,因此将返回一个结束迭代器并将其分配给
it
。然后在您的行中:

std::cout << *it_l << " " << *it_u << std::endl;
lower_bound()将迭代器返回到第一个元素,该元素不小于一个键。如果找不到该元素,则返回end()

请注意,使用end()返回的迭代器指向集合中超过end的元素。这是标准容器的正常行为,表明出现了问题。根据经验法则,您应该始终检查并相应地采取行动

您的代码就是上述情况的示例,因为集合中没有不小于11的元素。打印的“1”只是来自end()迭代器的垃圾值

请使用以下代码片段亲自查看:

#include <iostream>
#include <set>

using std::set;

int main(int argc, char argv) {
   set<int> myset;
   set<int>::iterator it_l, it_u;
   myset.insert(10);

   it_l = myset.lower_bound(11);
   if (it_l == myset.end()) {
       std::cout << "we are at the end" << std::endl;
   }

   it_u = myset.upper_bound(9);

   std::cout << *it_l << " " << *it_u << std::endl;
}
#包括
#包括
使用std::set;
int main(int argc、char argv){
设置myset;
set::迭代器it\u l,it\u;
myset.insert(10);
it_l=myset.下限(11);
如果(it_l==myset.end()){

std::在尝试取消引用迭代器之前,无法检查
myset.end()
。如何获得给定下限的值范围?在我看来,它应该将相同的迭代器返回到10。显然,它不以这种方式工作。因此在本例中,下限(9)=上限(9)?在这种情况下,是的。名称有误导性。下界(10)和上界(10)的值不同,因为上界将迭代器返回到大于键的第一个值,而下界将迭代器返回到大于或等于键的第一个值key@user8469759我在回答中增加了一个更完整的例子
#include <iostream>
#include <set>

using std::set;

int main(int argc, char argv) {
   set<int> myset;
   set<int>::iterator it_l, it_u;
   myset.insert(10);

   it_l = myset.lower_bound(11);
   if (it_l == myset.end()) {
       std::cout << "we are at the end" << std::endl;
   }

   it_u = myset.upper_bound(9);

   std::cout << *it_l << " " << *it_u << std::endl;
}