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

📅  最后修改于: 2023-12-03 15:29:49.960000             🧑  作者: Mango

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

std::set 是 C++ STL 中的一个容器,它是一个红黑树(Red-Black Tree)实现的有序集合,其中每个元素都是唯一的。std::set 是通过比较元素值来维护元素顺序的,因此它可以存储各种类型的数据,包括用户自定义类型。

以下是 std::set 的一些特性:

  • 每个元素都是唯一的
  • 所有元素总是按照元素值的比较顺序来存储的
  • 插入、删除、查找元素的时间复杂度均为 O(log(n))
  • 所有操作都保证在对数时间内完成
std::vector

std::vector 也是 C++ STL 中的一个容器,它是一个动态数组,可以存储各种类型的数据,包括用户自定义类型。std::vector 的元素可以是任意数据类型,包括基础数据类型和复合数据类型。

以下是 std::vector 的一些特性:

  • 内部使用动态数组实现
  • 内存是连续的,因此支持随机访问
  • 插入和删除元素的时间复杂度为 O(n),其中 n 是要移动的元素数量
  • 所有操作的时间复杂度与元素数量成线性关系
区别

std::set 和 std::vector 的最大区别是它们的底层数据结构不同。std::set 使用红黑树来存储元素,而 std::vector 使用动态数组来存储元素。因此,它们在插入、删除、查找元素的时间复杂度上有所不同。

另一个重要的区别是 std::set 中的元素总是有序的,而 std::vector 中的元素通常是无序的。这意味着如果你需要在容器中存储元素,并按照某种顺序访问它们,那么应该使用 std::set。如果你只需要在容器中存储元素,并随机访问它们,那么应该使用 std::vector。

使用场景

std::set 和 std::vector 都有它们自己的使用场景,具体取决于你的应用程序需要哪种数据结构。

如果你需要存储元素,并按照某种顺序访问它们,那么应该使用 std::set。例如,如果你需要在一个集合中存储和搜索字符串,那么 std::set 可能是一个很好的选择。

如果你只需要存储元素,并随机访问它们,那么应该使用 std::vector。例如,如果你需要在一个容器中存储和处理图像数据中的像素值,那么 std::vector 可能是一个更好的选择。

代码示例

下面是一个简单的代码示例,演示了如何使用 std::set 和 std::vector 存储和访问数据:

#include <iostream>
#include <set>
#include <vector>

int main()
{
    // 使用 std::set 存储元素,并按照元素值访问它们
    std::set<int> my_set{1, 2, 3, 4, 5};
    for (auto& element : my_set) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    // 使用 std::vector 存储元素,并随机访问它们
    std::vector<int> my_vector{1, 2, 3, 4, 5};
    for (auto& element : my_vector) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    return 0;
}

以上代码示例演示了如何在 std::set 和 std::vector 中存储和访问数据。您可以根据需要修改代码来使用不同的数据类型和元素数量。