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对象
    }
}

结果:

原文地址:https://www.cnblogs.com/yifengs/p/15187989.html