在 C++ STL 中的multiset crbegin() 和 crend() 函数
在 C++ STL 中,multiset 是一个非常有用的容器,可以存储一组有序的某种类型元素,而且元素可以重复。因为 multiset 属于关联式容器,所有元素都是按照一定的顺序存储的,如此设计,可以极大地简化我们的程序开发过程。我们知道 set 容器的 rbegin() 和 rend() 函数用于反向遍历元素,然而实际上更常用的是 crbegin() 和 crend() 函数,它们不仅可以反向遍历元素,还可以保证元素的只读属性。
multiset 的基本介绍
multiset 是一个有序的关联式容器,它的内部采用红黑树(Red-Black tree)来实现。 multiset 允许我们插入、删除元素,并且对元素进行查找和遍历等操作。
下面是 multiset 的定义方式:
#include<set>
multiset<int> a;
这里我们使用了
我们可以使用 insert() 函数来向 multiset 容器中插入元素,以下是一个示例:
multiset<int> a;
a.insert(10);
a.insert(10);
a.insert(20);
a.insert(30);
a.insert(30);
a.insert(30);
for(auto& i: a) {
std::cout << i << " ";
}
std::cout << std::endl;
以上代码中,我们使用 insert() 函数向 multiset 中插入了多个 10,20,30,然后进行了一次循环遍历,最终的输出结果是:10 10 20 30 30 30。
crbegin() 和 crend() 函数
crbegin() 和 crend() 函数都是 multiset 容器提供的成员函数,这两个函数返回值均为一个 const_reverse_iterator 迭代器,用于反向遍历 multiset 容器中的元素。同时,由于这两个函数返回的 const_reverse_iterator 迭代器始终指向 multiset 的最后一个元素的下一个位置和第一个元素的前一个位置,因此对于返回的迭代器,我们只能使用只读方式操作,即不能对其进行修改。
以下是 crbegin() 和 crend() 函数的使用示例:
multiset<int> a;
a.insert(10);
a.insert(10);
a.insert(20);
a.insert(30);
a.insert(30);
a.insert(30);
for(auto it = a.crbegin(); it != a.crend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
以上代码中,我们首先定义了一个 multiset 容器 a,并向其中插入了多个元素,然后使用 crbegin() 和 crend() 函数进行反向遍历,最后的输出结果是 30 30 30 20 10 10。可见,使用 crbegin() 和 crend() 函数可以非常方便地实现 multiset 容器的反向遍历。
需要注意的是,crbegin() 和 crend() 函数仅返回迭代器,如果想要获取最后一个元素或第一个元素,需要通过迭代器的成员函数获取。
下面是一个完整的示例代码,可以更全面地说明 crbegin() 和 crend() 函数的使用方法:
#include<iostream>
#include<set>
int main() {
std::multiset<int> a;
a.insert(10);
a.insert(10);
a.insert(20);
a.insert(30);
a.insert(30);
a.insert(30);
std::cout << "size: " << a.size() << std::endl;
std::cout << "count 10: " << a.count(10)<< std::endl;
std::cout << "max size: " << a.max_size() << std::endl;
std::cout << "empty: " << a.empty() << std::endl;
std::cout << "lower bound of 20: " << *a.lower_bound(20) << std::endl;
std::cout << "upper bound of 30: " << *a.upper_bound(30) << std::endl;
std::cout << "equal range of 10: " << *a.equal_range(10).first << " " << *a.equal_range(10).second << std::endl;
std::cout << "reverse traversal: ";
for(auto it = a.crbegin(); it != a.crend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
在上述代码中,我们除了使用 crbegin() 和 crend() 函数来进行反向遍历外,还展示了 multiset 容器的一些基础操作,如size()、count()、max_size()、empty()、lower_bound()、upper_bound() 和 equal_range() 等操作。
结论
crbegin() 和 crend() 函数在 multiset 容器中非常有用,它们可以帮助我们实现遍历,并且保证元素的只读性。与此同时,要记得在使用这些函数时,迭代器的只读属性也要做好相应的配置和处理。