关于c++:C-STL-deque迭代器

一、前言

deque 容器迭代器的类型为随机拜访迭代器。

二、deque反对的迭代器成员函数

函数 性能
begin() 返回指向容器中第一个元素的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器
end() 返回指向容器最初一个元素之后一个地位的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器。此函数通常和 begin() 搭配应用
rbegin() 返回指向最初一个元素的反向迭代器;如果是 const 类型容器,在该函数返回的是常量反向迭代器
rend() 返回指向第一个元素之前一个地位的反向迭代器。如果是 const 类型容器,在该函数返回的是常量反向迭代器。此函数通常和 rbegin() 搭配应用
cbegin() 和 begin() 性能相似,只不过其返回的迭代器类型为常量正向迭代器,不能用于批改元素
cend() 和 end() 性能雷同,只不过其返回的迭代器类型为常量正向迭代器,不能用于批改元素
crbegin() 和 rbegin() 性能雷同,只不过其返回的迭代器类型为常量反向迭代器,不能用于批改元素
crend() 和 rend() 性能雷同,只不过其返回的迭代器类型为常量反向迭代器,不能用于批改元素

函数的具体性能和array、vector的相似,这里不再具体阐明。stl反对全局的begin()和end()函数。

三、根本用法

1、begin()和end()

begin() 和 end() 别离用于指向「首元素」和「尾元素+1」 的地位

2、cbegin()和cend()

和 begin()/end() 惟一不同的是:cbegin()/cend() 成员函数返回的是 const 类型的正向迭代器,这样能够用来遍历容器内的元素,也能够拜访元素,然而不能对所存储的元素进行批改

3、rbegin()和rend()

别离示意指向最初一个元素和第一个元素前一个地位的随机拜访迭代器,又常称为反向迭代器。
crbegin()/crend() 组合和 rbegin()/crend() 组合惟一的区别在于:前者返回的迭代器为 const 类型迭代器,不能用来批改容器中的元素,除此之外在应用上和后者完全相同。

四、注意事项

1、迭代器的性能是遍历容器,在遍历的同时能够拜访(甚至批改)容器中的元素,但迭代器不能用来初始化空的 deque 容器。
2、对于空的 deque 容器来说,能够通过 push_back()、push_front() 或者 resize() 成员函数实现向(空)deque 容器中增加元素。
3、当向 deque 容器增加元素时,deque 容器会申请更多的内存空间,同时其蕴含的所有元素可能会被复制或挪动到新的内存地址(原来占用的内存会开释),这会导致之前创立的迭代器生效。和vector相似。

五、实例

 //全局begin和end
    i = 0;
    for (dequeIter = begin(dequeInt); dequeIter < end(dequeInt); dequeIter++)
    {
        std::cout << "global begin and end dequeInt[" << i << "]=" << *dequeIter << std::endl;
    }

    //cbegin/cend
    i = 0;
    std::deque<int>::const_iterator dequeIterC = dequeInt.cbegin();
    for (; dequeIterC != dequeInt.cend(); dequeIterC++)
    {
        std::cout << "cbegin and cend dequeInt[" << i << "]=" << *dequeIterC << std::endl;
    }

    //rbegin/rend
    i = 0;
    std::deque<int>::reverse_iterator dequeIterR = dequeInt.rbegin();
    for (; dequeIterR != dequeInt.rend(); dequeIterR++)
    {
        std::cout << "rbegin and rend dequeInt[" << i << "]=" << *dequeIterR << std::endl;
    }

    //crbegin/crend
    i = 0;
    std::deque<int>::const_reverse_iterator dequeIterCR = dequeInt.crbegin();
    for (; dequeIterCR != dequeInt.rend(); dequeIterCR++)
    {
        std::cout << "crbegin and crend dequeInt[" << i << "]=" << *dequeIterCR << std::endl;
    }

后果如下:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理