#include <iostream>
#include <string>

using namespace std;

#include <vector> // 容器 vector

#include <algorithm> // 使用系统算法的头文件


// 迭代器 遍历功能 用指针理解;
// 普通指针也算一种迭代器;
void test01() {
int array[5] = { 1, 3, 5, 6, 8 };

int* p = array; // 指针指向数组的首地址;

for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
cout << array[i] << endl;
}

for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
cout << *(p++) << endl;
}
}

void myPrint(int value) {
cout << value << endl;
}

void test02() {

vector<int> v; // 声明一个容器, 这个容器中存放int 类型数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);

// 遍历容器中的数据;
// 第一种遍历方法: 利用迭代器;
vector<int>::iterator itBegin = v.begin(); // itBegin 指向容器的起始位置;
vector<int>::iterator itEnd = v.end(); // itEnd 指向容器的最后一个位置的下一个地址;
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);
}

class Person {

public:
Person(string name, int age) {
this->name = name;
this->age = age;
}

void showInfo() {
cout << "name: " << this->name << " age: " << this->age << endl;
}

private:
string name;
int age;
};

// 利用迭代器遍历
void test03() {
vector<Person> v;
Person person1("roger", 19);
Person person2("rei ri", 20);
Person person3("o denn", 25);

v.push_back(person1);
v.push_back(person2);
v.push_back(person3);

for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
(*it).showInfo();
}
}

// 存放自定义类型的指针
void test04() {
vector<Person*> v;
Person person1("roger", 19);
Person person2("rei ri", 20);
Person person3("o denn", 25);

v.push_back(&person1);
v.push_back(&person2);
v.push_back(&person3);

for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) {
(*it)->showInfo();
}
}


// 容器嵌套容器
void test05() {
vector<vector<int>> v;

vector<int>v1;
vector<int>v2;
vector<int>v3;

// 填装小容器
for (int i = 0; i < 5; i++) {
v1.push_back(i + 1);
v2.push_back(i + 1);
v3.push_back(i + 1);
}

v.push_back(v1);
v.push_back(v2);
v.push_back(v3);

// 遍历所有数据
for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {
for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) {
cout << *vit << " ";
}
cout << endl;
}
}


int main() {

//test01();

//test02();

//test03();

//test04();

test05();

return EXIT_SUCCESS;
}