C++ STL中的unordered_set end()

C++ STL中的unordered_set end()

C++的STL标准库中,unordered_set是一种常用的容器,其底层实现是哈希表。与其他容器类似,unordered_set也有许多用于遍历容器的方法,其中end()方法被用来确定容器的结束位置。在本篇文章中,我们将详细了解unordered_set中的end()方法以及如何使用它。

unordered_set概述

unordered_set是一个存储唯一元素的集合容器,对于这个集合中的每个元素,哈希函数将把它映射到唯一的bucket中,因此unordered_set可以高效地插入、删除和查找元素。由于底层实现是哈希表,所以unordered_set的元素顺序是不确定的。

下面是一个unordered_set的简单示例,我们将在这个示例中使用end()方法。

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_set<int> mySet = {1, 2, 3, 4, 5};

    std::cout << "mySet contains:";
    for (auto it = mySet.begin(); it != mySet.end(); ++it)
    {
        std::cout << ' ' << *it;
    }
    std::cout << '\n';

    return 0;
}

运行这个程序,我们将得到如下输出:

mySet contains: 1 2 3 4 5

在这个程序中,我们创建了一个名为“mySet”的unordered_set,将一些整数插入其中,并使用for循环遍历这个unordered_set的每一个元素。这个for循环的结束条件是“it != mySet.end()”,这个条件保证了我们将mySet容器中的每个元素都遍历到。

unordered_set end()

在unordered_set中,end()方法用于返回一个迭代器,此迭代器指向unordered_set容器中的最后一个元素之后的位置。由于 unordered_set容器中的元素顺序是不确定的,所以最后一个元素是不确定的,在这种情况下,我们可以使用end()方法来取得unordered_set的结束迭代器。

下面是一个使用 end() 的简单示例:

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_set<int> mySet = {1, 2, 3, 4, 5};

    std::cout << "mySet content:";
    for (auto it = mySet.begin(); it != mySet.end(); ++it)
    {
        std::cout << ' ' << *it;
    }
    std::cout << '\n';

    std::cout << "mySet size = " << mySet.size() << '\n';

    std::cout << "mySet end() : " << *(mySet.end()) << '\n'; //错误,访问了end()迭代器指向的未定义行为

    return 0;
}

在这个例子中,我们使用mySet.begin()来获取unordered_set容器的开始迭代器,使用mySet.end()来获取unordered_set容器的结束迭代器。在for循环中,我们对unordered_set容器进行了遍历,遍历条件是“it != mySet.end()”,这保证了我们将unordered_set容器中的每个元素都遍历到。

需要注意的是,在上述代码中,我们使用了end()方法获取unordered_set容器的结束迭代器,但是我们同时访问了该迭代器的值,这是未定义行为。这里需要明确的是,end()返回一个指向unordered_set最后一个元素之后位置的迭代器,而这个位置没有存储任何数据,如果试图访问该位置,将会导致无法预测的行为。

使用find和end

除了在for循环中使用end()方法遍历unordered_set容器的所有元素外,我们还可以使用find()方法和end()方法来查找一个特定的元素。

使用find()方法可用于在unordered_set中查找指定元素,如果找到该元素,则返回指向该元素的迭代器,否则返回unordered_set容器的结束迭代器。下面是一个find()和end()的示例程序:

#include <iostream>
#include <unordered_set>

int main()
{
    std::unordered_set<int> mySet = {1, 2, 3, 4, 5};

    auto iter = mySet.find(3);
    if (iter != mySet.end())
        std::cout << "Found element : " << *iter << '\n';
    else
        std::cout << "Element not found in set\n";

    iter = mySet.find(6);
    if (iter != mySet.end())
        std::cout << "Found element : " << *iter << '\n';
    else
        std::cout << "Element not found in set\n";

    return 0;
}

在此示例程序中,我们使用find()方法来寻找mySet容器中的元素3和6。如果find()方法返回了一个非end()迭代器,则表示我们已经找到了该元素。如果find()方法返回的迭代器等于end()方法返回的迭代器,则找不到该元素。

运行这个程序,我们将得到如下输出:

Found element : 3
Element not found in set

结论

C++ STL标准库中,unordered_set是一种常用的容器,它可以高效地插入、删除和查找元素。在unordered_set中,end()方法用于返回一个迭代器,此迭代器指向unordered_set容器中的最后一个元素之后的位置。除了在for循环中使用end()方法遍历unordered_set容器的所有元素之外,我们还可以使用find()方法和end()方法来查找一个指定的元素。需要注意的是,在使用end()方法时,只能使用它来比较迭代器,不能访问其指向的值。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程