Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在std::set中查找邻居_C++_Stl - Fatal编程技术网

C++ 在std::set中查找邻居

C++ 在std::set中查找邻居,c++,stl,C++,Stl,我试图在std::set中查找元素的下一个/上一个邻居 我试过这样做: std::set<int> s; for (int i = 0; i < 10; ++i) { s.insert(i); } std::set<int>::iterator iter = s.find(5); EXPECT_EQ(5, *(iter++)); std::set s; 对于(int i=0;i

我试图在std::set中查找元素的下一个/上一个邻居

我试过这样做:

std::set<int> s;
  for (int i = 0; i < 10; ++i) {
    s.insert(i);
  }
  std::set<int>::iterator iter = s.find(5);
  EXPECT_EQ(5, *(iter++));
std::set s;
对于(int i=0;i<10;++i){
s、 插入(i);
}
std::set::iterator iter=s.find(5);
除等式(5,*(iter++)外;
但它不起作用


在高层次上,似乎从红黑树中可以找到O(logN)中的下一个/上一个元素,所以问题是std::set是否支持它?

如果您想在一行中这样做,则需要使用预增量(即
++iter
)而不是后增量(即
iter++
)来减少迭代器:

#include <iostream> 
#include <set>

int main() {
    std::set<int> s;

    for (int i = 0; i < 10; ++i) {
        s.insert(i);
    }

    std::set<int>::iterator iter; 
    iter = s.find(5);

    std::cout << "The number after 5 is: " << *(++iter) << "\n";
    iter--; // Go back to 5 (Here it doesn't matter if you use postdecrement or predecrement)
    std::cout << "The number before 5 is: " << *(--iter) << "\n";

    return 0;
}

注意,在获取下一个/上一个元素之前,您应该检查迭代器是否也不在末尾或开头。

代码中似乎有输入错误。您正在搜索5并转到下一个元素。这应该是6,而不是5。除此之外,你还搞砸了增量前后的工作。因此,在修复此问题后,它应该如下所示:

std::set<int> s;
for (int i = 0; i < 10; ++i) {
  s.insert(i);
}
std::set<int>::iterator iter = s.find(5);
EXPECT_EQ(6, *(++iter));
std::set s;
对于(int i=0;i<10;++i){
s、 插入(i);
}
std::set::iterator iter=s.find(5);
除式(6,*(++iter))外;

它是否在引擎盖下使用红黑树取决于实现。
std::set
的要求是它是有序的,并且支持双向迭代器。请详细说明“it not work”(it not work),明确说明什么是不起作用的。上面的代码对我来说是有效的。是的,它确实支持它,并且以您尝试过的方式支持它。所以你到底出了什么问题还不清楚。请不要说“它不起作用”。到底发生了什么?。您是否得到了不同的值(如果是,是什么),是否得到了崩溃、编译错误“它不起作用”被说了这么多次,但它对情况的描述完全不充分。如果你有
EXPECT_EQ(6,*(++iter)),你的问题会更接近标题。这很令人困惑。如果还包括宏的功能,则更好。但是OP使用的是
EXPECT_EQ(5,*(iter++),即增量后版本,但OP要求查找下一个元素,我对标题感到困惑,我猜。。。
std::set<int> s;
for (int i = 0; i < 10; ++i) {
  s.insert(i);
}
std::set<int>::iterator iter = s.find(5);
EXPECT_EQ(6, *(++iter));