1.STL(Standard Template Library)
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;
STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效;
从逻辑层次来看,在STL中体现了泛型化程序设计的思想,引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。与OOP(object-oriented programming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术;
从实现层次看,整个STL是以一种类型参数化的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性--模板(template)。
2.STL内容介绍
STL中六大组件:
容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
仿函数(Functor)
适配器(Adaptor)
分配器(allocator)
————————————————
版权声明:本文为CSDN博主「HUST_Miao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010183728/article/details/81913729
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void Print(int num)
{
cout << num << endl;
}
void fun()
{
vector<int> p;
p.push_back(10);//向容器内压入数据
p.push_back(20);
p.push_back(30);
p.push_back(40);
// 每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
//p.begin()返回迭代器,这个迭代器指向容器中第一个数据
//p.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
// 认为是一个指针
//vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
//vector<int>::iterator begin = p.begin();//begin就是指向压入容器的首元素地址
//vector<int>::iterator end = p.end(); // end就是指向压入容器末元素的下一个元素地址
最普通的遍历
//while (begin!=end)
//{
// cout << *begin << endl;
// begin++;
//}
//将这些遍历汇总成一句话,借助for循环
for (vector<int>::iterator begin = p.begin(); begin != p.end(); begin++)
{
cout << *begin << endl;
}
//前两种都是我们认为定义出来的遍历程序,algorithm库提供了遍历算法for_each
for_each(p.begin(), p.end(), Print);
}
int main()
{
fun();
return 0;
system("pause");
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
template <class T>
class Flower
{
public:
Flower(const T name,const T color):c_name(name),c_color(color){}
T c_name;
T c_color;
};
void fun1()
{
Flower<string> f1("玫瑰", "红");
Flower<string> f2("玫瑰", "黄");
Flower<string> f3("玫瑰", "蓝");
Flower<string> f4("玫瑰", "绿");
Flower<string> f5("玫瑰", "紫");
vector<Flower<string>*> v;
v.push_back(&f1); v.push_back(&f2); v.push_back(&f3); v.push_back(&f4); v.push_back(&f5);
for (vector<Flower<string>*>::iterator begin=v.begin();begin!=v.end();begin++)
{
cout << (*begin)->c_color << (*begin)->c_name << endl;
}
}
void fun()
{
Flower<int> f1(1, 1);Flower<int> f2(2, 2);Flower<int> f3(3, 3);Flower<int> f4(4, 4);Flower<int> f5(5, 5);
vector<Flower<int>> v;
v.push_back(f1);v.push_back(f2); v.push_back(f3); v.push_back(f4); v.push_back(f5);
for (vector<Flower<int>>::iterator it=v.begin();it!=v.end();it++)
{
cout << (*it).c_color << "\t" << (*it).c_name << endl;
}
}
int main()
{
fun();//将自定义数据类型压入Vector容器中
fun1();//将自定义数据类型的地址压入Vector容器中
return 0;
system("pause");
}
//套娃!定义内置数据类型的二维数组。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void fun()
{
vector<int> v1;
vector<int> v2;
vector<int> v3;
vector<int> v4;
vector<int> v5;
for (int i = 0; i < 5; i++)
{
v1.push_back(i + 1);
v2.push_back(i + 2);
v3.push_back(i + 3);
v4.push_back(i + 4);
v5.push_back(i + 5);
}
vector<vector<int>> v;
v.push_back(v1); v.push_back(v2); v.push_back(v3); v.push_back(v4); v.push_back(v5);
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) << "\t";
}
cout << endl;
}
}
int main()
{
fun();
return 0;
system("pause");
}