STL之三大组件:容器、算法、迭代器

本文介绍了STL中的三大核心组件——容器(如vector、deque)、算法(包括质变和非质变算法)和迭代器,阐述它们之间的交互关系。容器通过迭代器与算法相连接,迭代器作为容器与算法的桥梁,提供了高可重用性、高性能和高移植性的特点。文中还详细讲解了vector的特性,如何插入元素、预留空间以及遍历方法,并提到了deque容器的优势在于头部插入的便捷性。最后,举例展示了sort算法的应用。
摘要由CSDN通过智能技术生成

STL(Standard Template Library,标准模板库)
STL从广义上分为:容器(container) 算法(algorithm) 迭代器(iterator)
容器和算法之间通过迭代器进行无缝连接

STL六大组件:
容器:各种数据结构,如vector、list、deque、set、map等
算法:如sort、find、copy、for_each
迭代器:扮演了容器与算法之间的胶合剂,共有五种类型。
仿函数:
适配器:
空间配置器:

STL六大组件的交互关系

容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。

STL高可重用性,高性能,高移植性

STL三大组件
容器:分为序列式容器和关联式容器两种
序列式容器(原顺序)
关联式容器(有顺序,可自己制定)
算法:分为质变算法和非质变算法
质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找,计数,遍历,寻找极值等等
迭代器依序寻访某个元素所含的各个元素

输入迭代器 提供对数据的只读访问 只读,支持++、==、!=
输出迭代器 提供对数据的只写访问 只写,支持++
前向迭代器 提供读写操作,并能向前推进迭代器 读写,支持++、==、!=
双向迭代器 提供读写操作,并能向前和向后操作 读写,支持++,–
随机访问迭代器 提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器 读写,支持++、–、[n]、-n、<、<=、>、>=

我们可以把迭代器当指针理解,以下以遍历代码说明

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
//容器 
void test02()
{
	vector<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++;
	}
}
//迭代器 遍历功能 用指针理解
//普通指针也算一种迭代器
void test01()
{
	int array[5] = { 1,3,5,6,8 };
	
	int* p = array; //指针指向数组首地址 &array[0]
	for (int i = 0; i < 5; i++)
	{
		cout << *(p++) << endl;
	}
}

int main()
{
	test01();
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

test02中的迭代器效果与test01中的cout<<*(p++)<<endl;类似

还有两种遍历方法如下代码所示

	//第二种遍历方式
	//for(int i =0;i<10;i++)
	for (vector<int>::iterator it = v.begin; it != v.end; it++)
	{
		cout << *it << endl;
	}
	//第三种方式 利用算法
	for_each(v.begin(), v.end(),myPrint);

}

其中for_each的底层实现

// FUNCTION TEMPLATE for_each
template <class _InIt, class _Fn>
inline _Fn for_each(_InIt _First, _InIt _Last, _Fn _Func) { // perform function for each element [_First, _Last)
    _Adl_verify_range(_First, _Last);
    auto _UFirst      = _Get_unwrapped(_First);
    const auto _ULast = _Get_unwrapped(_Last);
    for (; _UFirst != _ULast; ++_UFirst) {
        _Func(*_UFirst);
    }

    return _Func;
}

总代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
void myPrint(int v);
//容器 
void test02()
{
	vector<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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值