• reverse_iterator和ostream_iterator


    每个容器都有反向迭代器(无需关联容器除外),reverse_iterator要和std::rbegin()以及std::end()配套使用,否则用了方向迭代器而不用rbegin()和rend()编译器是会报错的;接下来看例子:

    #include <iostream>
    #include <vector>
    #include <time.h>
    int main(int argc, char ** argv)
    {
        std::vector<int> vec;
        int _data = 0;
        srand(time(NULL));
        for (int i = 0; i < 10; ++i)
        {
            vec.push_back(rand() % 100);
        }
        for (std::vector<int>::iterator iter = std::begin(vec);iter != std::end(vec);++iter)
        {
            std::cout << *iter << " ";
        }
        std::cout << std::endl;
    
        std::cout << "input you want find data : ";
        std::cin >> _data;
    
        auto result = std::find(std::begin(vec), std::end(vec), _data);
        if (result != std::end(vec))
        {
            std::cout << "find this data and the position is : " << result - std::begin(vec) << std::endl;
        }
        else
        {
            std::cout << "no find !" << std::endl;
        }
    
        //revser_iterator,如果是用std::begin()他就会报错
        for (std::vector<int>::reverse_iterator reiter = std::rbegin(vec); reiter != std::rend(vec); ++reiter)
        {
            std::cout << *reiter << " ";
        }
        std::cout << std::endl;
        auto result1 = std::find(std::rbegin(vec), std::rend(vec), _data);
        if (result1 != std::rend(vec))
        {
            std::cout << "find this data and the position is : " << result1.base()-std::begin(vec) - 1 << std::endl;
    
        }
    
        return 0;
    }

    rbegin()返回的是最后一个元素的reverse_iterator,rend()返回的是第一个元素的前一个元素,这里和begin()和end()有所区别,begin()返回的是第一个元素,end()返回的是最后一个元素的后一个元素;

    再则就是reverse_iterator.base()返回的reverse_iterator()的后面一个元素;所以为了得到元素的具体位置就应该是base() - begin() - 1;

    运行的结果可以是这样(结果是不一定的因为采用了随机种子):

    24 90 77 97 50 65 45 25 95 97
    input you want find data : 65
    find this data and the position is : 5
    97 95 25 45 65 50 97 77 90 24
    find this data and the position is : 5
    请按任意键继续. . .

    这里的位置是索引位置

        std::copy(std::cbegin(vec), std::cend(vec), std::ostream_iterator<int>(std::cout," "));        //需要头文件<iteraor>,作用是打印所有vec的元素

    这里的copy()函数接受三个参数。第一个是复制范围的起始迭代器,第二个是参数是复制范围的尾迭代器,第三个是目的迭代器;

  • 相关阅读:
    宏定义中的#
    HDU1506 Largest Rectangle in a Histogram 动态规划
    HDU1864 最大报销额 DP
    POJ2771 Guardian of Decency 最大独立子集
    POJ1698 Alice's Chance 最大流
    HDU1003 Max Sum 动态规划
    eval格式化事件类型的字符串
    C#虚方法virtual详解
    c# 利用反射获得某个类或者对象的所有属性
    windows服务的通常写法
  • 原文地址:https://www.cnblogs.com/boost/p/10494486.html
Copyright © 2020-2023  润新知