我需要在C ++中使用树集数据结构(在Java中可用),并使用TreeSet.lower(i)和TreeSet.higher(i) - >等函数。它返回的元素只是更低,并且在给定的树集中只比i高。有STL吗?
编辑: 以下是我需要的功能,我想知道如何使用upper_bound和lower_bound函数来执行此操作:
for (int i = 1; i<10; i++) myset.insert(i * 10); // 10 20 30 40 50 60 70 80 90
int k = 50; // I need 40 and 60
set<int>::iterator itr = myset.find(k);
if (itr != myset.end()) {
// Found the element
itr--; // Previous element;
cout << *(itr); //prints 40
itr++; // the element found
itr++; // The next element
cout << *(itr); // prints 60
}
答案 0 :(得分:9)
使用std::set
,它通常作为二叉搜索树实现。
其insert()
,erase()
和find()
方法的大小是对数的,但如果给出提示可以做得更好。对数复杂性被引用到Java TreeSet。
我认为你应该感兴趣的是std::lower_bound
,它返回一个迭代器到下界,而std::upper_bound
则返回一个迭代器到上界。
答案 1 :(得分:2)
您可以使用std::set
查看std::set::lower_bound
和std::set::upper_bound
答案 2 :(得分:1)
您可以在此处使用std :: set。 对于您的功能,您可以使用upper_bound(i)和lower_bound(i)函数,但要注意的是它们与TreeSet.lower(i)和TreeSet.higher(i)的工作方式不同。
lower_bound(const i) –返回对容器中第一个元素进行迭代的迭代器,该元素不视为在i之前(即,它等效或在其之后),或设置为: :结束,如果所有元素都被认为位于i之前。
upper_bound(const i) –将迭代器返回到容器中被认为位于i之后的第一个元素,如果没有元素被认为位于i之后,则返回set :: end。 / p>
for (int i = 1; i<10; i++) myset.insert(i * 10); // 10 20 30 40 50 60 70 80 90
int k = 50;
set<int>::iterator itlow,itup;
itlow=myset.lower_bound (k);
itup=myset.upper_bound (k);
if(itlow!=myset.begin()){
itlow--;
cout << *itlow; // 40 will print
}
cout << *itup; // 60 will print