一、前言
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;
结果如下:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。