c++STL基本理论

//STL(标准模板库)

//STL广义上分为:容器,算法,迭代器

//容器和算法之间通过迭代器进行无缝连接

//容器:

//序列式容器:容器元素的位置是由进入容器的时间和地点来决定的

//关联式容器:容器已经有固定的规则,进入容器元素的位置在进入之前就已经确定,与进入容器的时间和地点无关

//迭代器:

//迭代器相当于数组的指针,迭代器起始是指向容器第一个元素,迭代器加加和减减也是增加或减少一个元素的长度,可以理解为指针

//迭代器实质上是一个类对象,迭代器的类封装了一个指针,并重写了很多操作符

//算法:

//通过有限的步骤,解决问题

//STL提供了大约100多种算法函数模板

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <vector>//容器头文件

#include <algorithm>//算法头文件

using namespace std;

class Person

{

public:

Person(int id, int age) :id(id), age(age) {}

int getId()

{

return id;

}

int getAge()

{

return age;

}

private:

int id;

int age;

};

//算法,负责统计某个元素的个数

int myCount(int *begin, int *end, int val)

{

int count = 0;

while (begin != end)

{

if (*begin == val)

{

count++;

}

begin++;

}

return count;

}

void printVector1(int v)//回调打印函数的形参为容器里数据的类型

{

cout << v << endl;

}

void printVector2(Person v)

{

cout << "id = " << v.getId() << endl;

cout << "age = " << v.getAge() << endl;

}

void printVector3(Person *v)

{

cout << "this->id = " << v->getId() << endl;

cout << "this->age = " << v->getAge() << endl;

}

int main()

{

//数组,本质上也是一个容器

int arr[] = { 1,3,6,7,4,5,9,5,5 };

//下面两段代码即为迭代器类中的成员变量

int *begin = arr;//迭代器起始位置

int *end = &(arr[sizeof(arr) / sizeof(int)]);//这是指向数组最后一个元素的下一个位置,并不是真相最后一个元素

int count = myCount(begin, end, 5);

cout << "count = " << count << endl;

//STL基本语法

vector<int> v1;//定义一个容器,并指定这个容器存放的元素类型是int

v1.push_back(10);//放在尾部

v1.push_back(20);//放在更尾部

v1.push_back(30);

//通过STL提供的for_each算法,进行遍历

//容器提供迭代器

//也可以这样写

vector<int>::iterator pBegin = v1.begin();//这就是v的起始迭代器

vector<int>::iterator pEnd = v1.end();//不能直接使用begin和end,这两个变量好像被系统使用了

//容器里的类型不确定,因此for_each调用第三个参数进行数据打印,即传入vector元素进入第三个参数中,进行数据打印

for_each(v1.begin(), v1.end(), printVector1);

//容器也可以存放对象

vector<Person> v2;

Person p1(10, 20), p2(30, 40), p3(50, 60);

v2.push_back(p1);

v2.push_back(p2);

v2.push_back(p3);

for_each(v2.begin(), v2.end(), printVector2);

//不使用算法,自己遍历

//自己遍历的时候,一定需要定义出迭代器,牢记

vector<Person>::iterator it = v2.begin();//取到v2的起始迭代器

while (it != v2.end())

{

printVector2(*it);

it++;

}

//传入对象指针

vector<Person *> v3;

v3.push_back(&p1);

v3.push_back(&p2);

v3.push_back(&p3);

for_each(v3.begin(), v3.end(), printVector3);

return 0;

}

猜你喜欢

转载自blog.csdn.net/tulipless/article/details/81135231