一.概念

  • STL(标准模板库):从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator),容器和算法之间通过迭代器进行无缝连接,STL几乎所有代码都采用了模板类和模板函数,相比较传统的由函数和类组成的库来说提供了更好的代码重用机会。
  • STL的一个重要特点是数据结构和算法分离。

1.容器

各种数据结构:vector、list、deque、set、map。

#include <vector>//动态数组、可变数组
  • 序列式容器:容器的元素的位置是由进入容器时间和地点来决定。(先进容器,就现在前面)
  • 关联式容器:按规定排序。(类似于按照人类按照大小个子排顺序)

2.迭代器

#include <algorithm>//算法

用于遍历容器元素的指针。默认指向容器第一个位置。

对指针的操作,对迭代器都能实现。

实际上,迭代器是一个类,这个类封装了一个指针。

STL容器位运算与常用库函数 stl 容器_算法

3.算法

通过有限步骤,解决问题。
如:sort、search、copy、erase…

4.容器、迭代器、算法关系

STL容器位运算与常用库函数 stl 容器_#include_02

5.仿函数(functors)

仿函数是一种重载了operator()的class、struct。一般函数指针可视为侠义的仿函数。

二.STL容器算法迭代器分离案例

STL容器位运算与常用库函数 stl 容器_算法_03


当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;
}

STL容器位运算与常用库函数 stl 容器_#include_04

三.容器创建、添加、遍历

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);
}

结果:

STL容器位运算与常用库函数 stl 容器_STL容器位运算与常用库函数_05

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();
}

结果:

STL容器位运算与常用库函数 stl 容器_STL容器位运算与常用库函数_06

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;
	}
}

结果:

STL容器位运算与常用库函数 stl 容器_c++_07