set的有序与无序

发布时间:2023-05-20

一、set的定义

set是C++ STL中的容器之一,用于存储不重复的元素,通常用于快速查找和去重。

二、set的基本特性

set容器中的元素是按照从小到大的顺序排列,并且不允许有重复的元素。但是,set并不是完全有序的容器,因为元素的插入和删除会影响元素在容器中的位置。 代码示例:

#include <iostream>
#include <set>
using namespace std;
int main() {
    set<int> myset;
    myset.insert(1);
    myset.insert(3);
    myset.insert(5);
    myset.insert(2);
    myset.insert(4);
    for(auto it=myset.begin(); it!=myset.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
    return 0;
}
// Output: 1 2 3 4 5

三、有序set(set)

set的默认排序方式是从小到大,也就是说它是有序的。如果我们想要更改排序方式,可以自定义比较函数。 代码示例:

#include <iostream>
#include <set>
using namespace std;
bool cmp(int a, int b) {
    return a > b;
}
int main() {
    set<int, decltype(cmp)> myset(cmp);
    myset.insert(1);
    myset.insert(3);
    myset.insert(5);
    myset.insert(2);
    myset.insert(4);
    for(auto it=myset.begin(); it!=myset.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
    return 0;
}
// Output: 5 4 3 2 1

四、无序set(unordered_set)

无序set是C++11新增的容器,它的元素是无序的。虽然插入和删除操作比有序set快,但是查找操作的时间复杂度较高。 代码示例:

#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
    unordered_set<int> myset;
    myset.insert(1);
    myset.insert(3);
    myset.insert(5);
    myset.insert(2);
    myset.insert(4);
    for(auto it=myset.begin(); it!=myset.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
    return 0;
}
// Output: 5 1 2 3 4

五、小结

set是C++ STL中常用的容器之一,有序set的元素是按照从小到大的顺序排列,而无序set的元素是无序的。在选择set容器时,需要根据具体的需求进行选择。