C++ STL 中的deque crend

C++ STL 中的deque crend

C++ STL中,deque 是一种双端队列,支持从两端进行插入和删除操作。在对deque进行操作时,往往需要对它进行迭代,因此C++ STL提供了一些迭代器,如 beginendcbegincend 。在本文中,我们主要介绍 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;
}

上述实例中,需要包含 头文件。其中的 push_back 与 push_front 表示在 deque的末端和头部插入元素的操作; insert 中的碰到了迭代器操作。关于 deque 的插入和删除操作,我们留到另外的文章中讲。

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时所返回的指针是相同的,具体来说,返回的均为正向迭代器。因此,它们在使用时可以直接互换,没啥区别。

但是在反向访问时,情况就有所不同了,cbeginbegin 互换则会发生编译错误。

#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 返回的是反向迭代器。所以,在实际开发中,建议使用 cbegincrbegin 来表示 const 迭代器和 const 反向迭代器。

总结

deque 是一个支持双向操作的STL容器,在操作过程中经常需要用到迭代器,其中 crend 是 deque 中的一个高效的反向迭代器。通过使用 crend ,我们可以优雅地实现 deque 反向遍历的操作,提高代码的可读性和效率。

对于 cbegincrbegin ,尽管它们在正向访问容器时所返回的迭代器类型相同,但在反向迭代器的情况下,它们的返回值并不相同。因此,在使用表示 const 迭代器和 const 反向迭代器时,建议使用 cbegincrbegin

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程