C++ STL 中的deque crend
在C++ STL中,deque 是一种双端队列,支持从两端进行插入和删除操作。在对deque进行操作时,往往需要对它进行迭代,因此C++ STL提供了一些迭代器,如 begin
、 end
、 cbegin
和 cend
。在本文中,我们主要介绍 deque 迭代器中的 crend
。
deque(双端队列)
deque是一个双端队列(即double-ended queue或deque),使用与vector相似的动态数组技术存储数据,可以高效添加或删除两端的元素。
在STL中,deque通过allocator类作为其默认的内存分配器,因此使用deque不必想malloc和free函数一样管理内存。deque类的定义在头文件<deque>
中。
头文件
deque头文件中定义了deque模板类。头文件包含以下内容:
#include <deque>
定义deque
deque定义方式类似于数组,创建deque对象后,可以在队列的前面、后面插入或删除元素,如下:
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque<int> data;
data.push_back(1); // 在deque队列的后面添加元素
data.push_front(3); // 在deque队列的前面添加元素
data.insert(data.end(),2); // 在deque队列的最后一个的位置添加元素
data.insert(data.begin()+2,5); // 在deque队列中第二个元素的位置添加元素
deque<int>::iterator it; // 迭代器
for(it=data.begin();it!=data.end();it++)
{
cout<<*it<<" "; // 输出deque队列的元素
}
cout<<endl;
return 0;
}
上述实例中,需要包含
crend方法
deque 提供了双向访问迭代器。在 deque 中,我们可以使用 crend
函数返回反向结束迭代器,通过迭代器可以遍历deque的元素。表示从 deque 的末尾到开头(由底向上)的反向迭代器。
#include <iostream>
#include <deque>
int main ()
{
std::deque<int> mydeque (5,0); // 5个0的deque队列
for (std::deque<int>::reverse_iterator rit=mydeque.rbegin(); rit!=mydeque.crend(); ++rit)
std::cout << ' ' << *rit; // 输出顺序为 0 0 0 0 0
std::cout << std::endl;
return 0;
}
输出结果:
0 0 0 0 0
crend 的返回类型是反向迭代器,该类型定义类似于正向迭代器:
std::deque<int>::const_reverse_iterator crend();
const_reverse_iterator crend() const;
由此可以看出,crend方法主要用于deque队列的反向遍历,即从后向前遍历时是非常有用的。
cbegin和cbegin方法区别
而 cbegin 和 begin 方法契合的话,大家可能会有些疑惑,因为它们在正向访问deque时所返回的指针是相同的,具体来说,返回的均为正向迭代器。因此,它们在使用时可以直接互换,没啥区别。
但是在反向访问时,情况就有所不同了,cbegin
与 begin
互换则会发生编译错误。
#include <iostream>
#include <deque>
int main()
{
std::deque<int> mydeque (5,0);
for (std::deque<int>::const_reverse_iterator cit=mydeque.crbegin(); cit!=mydeque.crend(); ++cit)
std::cout << ' ' << *cit;
std::cout << std::endl;
return 0;
}
输出结果:
0 0 0 0 0
从上述代码可以看出,对于 cbegin 和 crbegin ,它们虽然返回的指针类型都是相同的,但是,从输出结果来看,它们的确有所不同,cbegin
返回的还是正向迭代器,而 crbegin
返回的是反向迭代器。所以,在实际开发中,建议使用 cbegin
和 crbegin
来表示 const 迭代器和 const 反向迭代器。
总结
deque 是一个支持双向操作的STL容器,在操作过程中经常需要用到迭代器,其中 crend
是 deque 中的一个高效的反向迭代器。通过使用 crend
,我们可以优雅地实现 deque 反向遍历的操作,提高代码的可读性和效率。
对于 cbegin
和 crbegin
,尽管它们在正向访问容器时所返回的迭代器类型相同,但在反向迭代器的情况下,它们的返回值并不相同。因此,在使用表示 const 迭代器和 const 反向迭代器时,建议使用 cbegin
和 crbegin
。