zoukankan      html  css  js  c++  java
  • STL三大组件(容器、算法、迭代器)初始及区分*it和it

    容器 vector

    算法 for_each 头  algorithm

    迭代器  iterator  每个容器有专属迭代器

    • vector<int >v 
    • vector<int>::iterator  it = …..
    • v.begin() 指向第一个数据
    • v.end 指向 最后一个数据的下一个地址
    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    
    //迭代器 遍历功能 用指针来理解
    //普通指针也是一种迭代器
    void test01()
    {
        int array[5] = { 1,4,5,3,8 };
        int* p = array;     //指针指向数据首地址  &array[0]
        for (int i = 0; i < 5; i++)
        {
            cout << *(p++) << endl;
        }
    }
    
    #include <vector>  //容器
    void test02()
    {
        //声明容器
        vector<int> v;  //声明一个容器 这个容器中存放int类型数据 对象名称为 v
        v.push_back(10);
        v.push_back(20);
        v.push_back(30);
        v.push_back(40);
    
        //遍历容器中的数据
        //遍历方式一 利用迭代器遍历
    
        vector<int>::iterator itBegin = v.begin();  //itBegin指向的是v容器的起始位置
        vector<int>::iterator itEnd = v.end();  //itEnd指向的是v容器的最后一个位置的下一个地址
        while (itBegin != itEnd)
        {
            cout << *itBegin << endl;
            itBegin++;
        }
    }
    
    int main()
    {
        test02();
        system("Pause");
        return 0;
    }

    如图:

    结果:

    第二种遍历方法

    第三种遍历方法 算法

    void myPrint(int v)     //回调函数
    {
        cout << v << endl;
    }
    #include <vector>  //容器
    #include <algorithm>    //使用系统算法头文件
    void test02()
    {
        //声明容器
        vector<int> v;  //声明一个容器 这个容器中存放int类型数据 对象名称为 v
        v.push_back(10);
        v.push_back(20);
        v.push_back(30);
        v.push_back(40);
    
        //遍历容器中的数据
        //利用迭代器遍历
    
        //遍历方式一
        //vector<int>::iterator itBegin = v.begin();  //itBegin指向的是v容器的起始位置
        //vector<int>::iterator itEnd = v.end();  //itEnd指向的是v容器的最后一个位置的下一个地址
        //while (itBegin != itEnd)
        //{
        //    cout << *itBegin << endl;
        //    itBegin++;
        //}
    
        //遍历方式二
       /* for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << *it << endl;
        }*/
    
        //遍历方式三 利用算法 需要引入头文件 还要有一个回调函数
        for_each(v.begin(), v.end(), myPrint);      //for_each(初始地址,结束,回调函数)
    }

    自定义类型

    //自定义类型
    class Person
    {
    public:
        Person(string name, int age)
        {
            this->m_Name = name;
            this->m_Age = age;
        }
        string m_Name;
        int m_Age;
    };
    void test03()
    {
        vector<Person> v;
        Person p1("张飞", 20);
        Person p2("关羽", 21);
        Person p3("刘备", 22);
        Person p4("吕布", 20);
    
        v.push_back(p1);
        v.push_back(p2);
        v.push_back(p3);
        v.push_back(p4);
    
        for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << "姓名: " << (*it).m_Name << " 年龄: " << it->m_Age << endl; //*it是容器内的数据类型 即<Person>里面的数据类型   it是Person的指针
        }
    }
    
    int main()
    {
        test03();
        //test02();
        //test01();
        system("Pause");
        return 0;
    }

    结果:

    存放自定义数据的指针

    //存放自定义数据类型的指针
    void test04()
    {
        vector<Person *> v;
        Person p1("张飞", 20);
        Person p2("关羽", 21);
        Person p3("刘备", 22);
        Person p4("吕布", 20);
    
        v.push_back(&p1);       //因为定义的容器是Person的指针 所以要存放地址
        v.push_back(&p2);
        v.push_back(&p3);
        v.push_back(&p4);
    
        for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << "姓名: " << (*it)->m_Name << " 年龄:" << (*(*it)).m_Age << endl; //*it即Person* 是Person对象的指针 所以用->取值 , **it 指针指向的内容,即Person对象
        }
    }

    结果:

  • 相关阅读:
    jq的遍历与杂项
    jq的事件
    jquery的效果
    jquery入门
    面向对象。对象的继承
    面向对象克隆对象
    面向对象this指向问题
    实例对象及原型链
    GCD多线程任务总结
    C语言链表的简单实用
  • 原文地址:https://www.cnblogs.com/yifengs/p/15187989.html
Copyright © 2011-2022 走看看