一、前言

set 容器类模板中未提供 at() 成员函数,也未对 [] 运算符进行重载。C++ STL 标准库为 set 容器配置的迭代器类型为双向迭代器,则set容器的迭代器支持++p、p++、--p、p--、*p 操作,并且 2 个双向迭代器之间做比较,只能使用 == 或者 != 运算符。

1、迭代器方法

方法功能
begin()返回指向容器中第一个(注意,是已排好序的第一个)元素的双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器
end()返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器
rbegin()返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器
rend()返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。通常和 rbegin() 结合使用。如果 set 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器
cbegin()和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值
cend()和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值
crbegin()和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值
crend()和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值
find(val)在 set 容器中查找值为 val 的元素,如果成功找到,则返回指向该元素的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器
lower_bound(val)返回一个指向当前 set 容器中第一个大于或等于 val 的元素的双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器
upper_bound(val)返回一个指向当前 set 容器中第一个大于 val 的元素的迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器
equal_range(val)该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等价,pair.second 和 upper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的值为 val 的元素(set 容器中各个元素是唯一的,因此该范围最多包含一个元素)

以上成员函数返回的迭代器,指向的只是 set 容器中存储的元素,而不再是键值对。以上成员方法返回的迭代器,无论是 const 类型还是非 const 类型,都不能用于修改 set 容器中的值。
begin和end方法在这里不再说明。equal_range(val) 函数的返回值是一个 pair 类型数据,其包含 2 个迭代器,表示 set 容器中和指定参数 val 相等的元素所在的区域,但由于 set 容器中存储的元素各不相等,因此该函数返回的这 2 个迭代器所表示的范围中,最多只会包含 1 个元素。

二、实例

1、find和count

std::set<std::string> myset1{ 
                            "who are you",
                            "i am lin",
                            "i am wu",
                            "i am ouyang"};
std::cout << "myset1 size: " << myset1.size() << std::endl;
std::set<std::string>::iterator setIter = myset1.begin();
for (; setIter != myset1.end(); setIter++)
{
    std::cout << "myset1 :" << *setIter << std::endl;
}

//find
set<std::string>::iterator findIter = myset1.find("i am wu");
cout << "findIter: " << *findIter << endl;

//count
int nCount = myset1.count("i am wu");
cout << "nCount: " << nCount << endl;

2、lower_bound和upper_bound

set<std::string>::iterator lowerIter = myset1.lower_bound("i am wu");
cout << "lowerIter: " << *lowerIter << endl;

set<std::string>::iterator upperIter = myset1.upper_bound("i am wu");
cout << "upperIter: " << *upperIter << endl;

3、equal_range

pair<set<std::string>::iterator, set<std::string>::iterator>  mypair = myset1.equal_range("i am wu");
set<std::string>::iterator pairIter1 = mypair.first;
cout << "pairIter1: " << *pairIter1 << endl;

set<std::string>::iterator pairIter2 = mypair.second;
cout << "pairIter2: " << *pairIter2 << endl;

结果如下:
image.png


等待樱花盛开
1 声望0 粉丝

小菜鸟一枚,望各位大佬不吝指教,用于记录学习