📅  最后修改于: 2023-12-03 14:39:51.742000             🧑  作者: Mango
在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适合保存不同类型的元素,并且需要进行排序、查找、插入、删除等操作。