乐趣区

关于c++:c-STL-set容器迭代器

一、前言

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;

后果如下:

退出移动版