一.概念
- STL(标准模板库):从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator),容器和算法之间通过迭代器进行无缝连接,STL几乎所有代码都采用了模板类和模板函数,相比较传统的由函数和类组成的库来说提供了更好的代码重用机会。
- STL的一个重要特点是数据结构和算法分离。
1.容器
各种数据结构:vector、list、deque、set、map。
#include <vector>//动态数组、可变数组
- 序列式容器:容器的元素的位置是由进入容器时间和地点来决定。(先进容器,就现在前面)
- 关联式容器:按规定排序。(类似于按照人类按照大小个子排顺序)
2.迭代器
#include <algorithm>//算法
用于遍历容器元素的指针。默认指向容器第一个位置。
对指针的操作,对迭代器都能实现。
实际上,迭代器是一个类,这个类封装了一个指针。
3.算法
通过有限步骤,解决问题。
如:sort、search、copy、erase…
4.容器、迭代器、算法关系
5.仿函数(functors)
仿函数是一种重载了operator()的class、struct。一般函数指针可视为侠义的仿函数。
二.STL容器算法迭代器分离案例
当pBegin=pEnd的地址时,容器遍历结束。
案例:
//统计val在容器中出现的次数
int mycount(int* start, int* end, int val) {
int count=0;
while (start!=end)
{
if (*start == val) {
count++;
}
start++;
}
return count;
}
int main() {
//数组 容器
int arr[] = { 0,1,2,3,4,0,6,7,8,0 };
int* pBegin = arr;//指向容器第一个位置
int* pEnd = &(arr[sizeof(arr) / sizeof(int)]);//指向容器最后位置的下一个位置
int count = mycount(pBegin, pEnd, 0);
cout << count << endl;
}
三.容器创建、添加、遍历
1.容器装int型:
#include <iostream>
#include <vector>//动态数组、可变数组
#include <algorithm>//算法
using namespace std;
void show(int v) {
cout<<v<<" ";
}
//STL基本语法
void test01() {
//定义一个容器,并且制定容易存放元素类型int
vector<int> v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
v.push_back(3);
//容器提供的迭代器,所以是vector<int>::iterator
vector<int>::iterator pBegin = v.begin();
vector<int>::iterator pEnd = v.end();
//通过STL提供for_each算法
for_each(pBegin, pEnd, show);
}
结果:
2.容器装自定义类型
遍历方法一:
#include <iostream>
#include <vector>//动态数组、可变数组
#include <algorithm>//算法
using namespace std;
//容器存放自定义类型
class Person {
friend void show1(Person v);
public:
Person(int age,int id):age(age),id(id){}//构造函数
private:
int age;
int id;
};
void show1(Person v) {
cout << "age=" << v.age << ",id=" << v.id << " "<<endl;
}
void test02() {
vector<Person> v;
Person p1(10, 20), p2(30, 40), p3(50, 60);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
//迭代器
vector<Person>::iterator pBegin = v.begin();
vector<Person>::iterator pEnd = v.end();
//遍历,方法一
for_each(pBegin, pEnd, show1);
}
遍历方法二:
#include <iostream>
#include <vector>//动态数组、可变数组
#include <algorithm>//算法
using namespace std;
//容器存放自定义类型
class Person {
friend void test02();
public:
Person(int age,int id):age(age),id(id){}//构造函数
private:
int age;
int id;
};
void test02() {
vector<Person> v;
Person p1(10, 20), p2(30, 40), p3(50, 60);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
//遍历,方法二
for (vector<Person>::iterator p = v.begin(); p != v.end(); p++) {
cout << "age=" << (*p).age << ",id=" << (*p).id << " " << endl;
}
}
int main() {
test02();
}
结果:
3.容器装自定义类型指针
遍历方法一:
#include <iostream>
#include <vector>//动态数组、可变数组
#include <algorithm>//算法
using namespace std;
class Person {
friend void show2(Person* v);
public:
Person(int age,int id):age(age),id(id){}//构造函数
private:
int age;
int id;
};
void show2(Person* v) {
cout << "age=" << v->age << ",id=" << v->id << " " << endl;
}
void test03() {
vector<Person*> v;
Person p1(10, 20), p2(30, 40), p3(50, 60);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
//迭代器
vector<Person*>::iterator pBegin = v.begin();
vector<Person*>::iterator pEnd = v.end();
//遍历,方法一
for_each(pBegin, pEnd, show2);
}
遍历方法二:
#include <iostream>
#include <vector>//动态数组、可变数组
#include <algorithm>//算法
using namespace std;
class Person {
friend void test03();
public:
Person(int age,int id):age(age),id(id){}//构造函数
private:
int age;
int id;
};
void show2(Person* v) {
cout << "age=" << v->age << ",id=" << v->id << " " << endl;
}
void test03() {
vector<Person*> v;
Person p1(10, 20), p2(30, 40), p3(50, 60);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
//遍历,方法二
for (vector<Person*>::iterator p = v.begin(); p != v.end(); p++) {
cout << "age=" << (*p)->age << ",id=" << (*p)->id << endl;
}
}
结果: