📜  C++ STL中std :: set与std :: vector之间的区别(1)

📅  最后修改于: 2023-12-03 14:39:51.742000             🧑  作者: Mango

C++ STL中std::set与std::vector之间的区别

在C++ STL中,set和vector是两个常用的容器。它们具有不同的特点和用途。下面介绍它们的区别。

容器特点

vector是一个序列容器,它可以存储同一种数据类型的元素,支持顺序访问和随机访问。它使用动态数组实现,因此在尾部插入或删除元素时效率较高,但在其他位置插入或删除元素时相对较慢。

set是一个关联容器,它可以存储不同的数据类型的元素,支持元素的查找、插入和删除等操作。它使用平衡树(红黑树)实现,因此元素按照一定的规则(默认按升序排序)存储,支持有序访问。

插入和删除操作

vector的尾部插入和删除元素非常快,但在其他位置插入或删除元素时,需要将该位置之后的元素向后或向前移动,时间复杂度为O(n)。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec = {1, 2, 3, 4};

    // 尾部插入元素
    vec.push_back(5);

    // 在第二个位置插入元素
    vec.insert(vec.begin() + 1, 6);

    // 删除第三个元素
    vec.erase(vec.begin() + 2);

    for (int i = 0; i < vec.size(); i++)
    {
        cout << vec[i] << endl;
    }

    return 0;
}

set按照元素的顺序存储,插入和删除操作会影响整个平衡树的结构,因此时间复杂度为O(log n)。

#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<int> s = {1, 2, 3, 4};

    // 插入元素
    s.insert(5);

    // 删除元素
    s.erase(2);

    for (auto it = s.begin(); it != s.end(); it++)
    {
        cout << *it << endl;
    }

    return 0;
}
查找操作

vector支持随机访问,通过下标可以直接访问vector中的元素。因此查找某个元素的时间复杂度为O(1)。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec = {1, 2, 3, 4};

    cout << vec[1] << endl;

    return 0;
}

set使用平衡树存储元素,查找某个元素的时间复杂度为O(log n)。

#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<int> s = {1, 2, 3, 4};

    auto it = s.find(2);
    if (it != s.end())
    {
        cout << *it << endl;
    }

    return 0;
}
总结

set和vector都是常用的容器,根据需求选择使用。vector适合保存大量同一类型的元素,并且需要频繁在尾部插入或删除元素;set适合保存不同类型的元素,并且需要进行排序、查找、插入、删除等操作。