一、前言
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;
后果如下: