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()方法时,只能使用它来比较迭代器,不能访问其指向的值。