是否在C ++中具有相似功能的TreeSet数据结构

时间:2018-04-28 15:41:43

标签: java c++ data-structures set treeset

我需要在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
}

3 个答案:

答案 0 :(得分:9)

使用std::set,它通常作为二叉搜索树实现。

insert()erase()find()方法的大小是对数的,但如果给出提示可以做得更好。对数复杂性被引用到Java TreeSet

我认为你应该感兴趣的是std::lower_bound,它返回一个迭代器到下界,而std::upper_bound则返回一个迭代器到上界。

答案 1 :(得分:2)

您可以使用std::set
查看std::set::lower_boundstd::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