一、六大组件:
容器:
各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。
算法:
各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte。
迭代器:
扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
仿函数:
行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template。
适配器:
一种用来修饰容器或者仿函数或迭代器接口的东西。
空间配置器:
负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte。
二、优点
1.STL 是 C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
2.STL 的一个重要特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作
程序员可以不用思考 STL 具体的实现过程,只要能够熟练使用 STL 就 OK 了。这样他们就可以把精力放在程序开发的别的方面。
3.STL 具有高可重用性,高性能,高移植性,跨平台的优点。
高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
高性能:如 map 可以高效地从十万条记录里面查找出指定的记录,因为 map 是采用红黑树的变体实现的。
高移植性:如在项目 A 上用 STL 编写的模块,可以直接移植到项目 B 上。
三、普通示例代码
* STL--标准模板库 容器(类模板)和算法(函数模板)
* 容器--vector,stack,queue,list,set,map,multiset,multimap...
* 算法--copy,sort,find,find_if,count,count_if,swap...
* 迭代器--容器和算法的粘合剂--可以将他认为指针
* 用迭代器将容器中的元素访问出来然后通过算法来操作
* 类似:数组(容器) 排序(算法)指针(迭代器)
* 仿函数--函数对象,将它放在算法中,可以将算法的功能得以扩展
* 每个容器封装了自己得迭代器
int main()
{
int num[5] = { 1,2,3,4,5 };
vector<int> vv1;//空对象
vector<int> vv2(5);//5个0
vector<int> vv3(4,9);//4个9
vector<int> vv4(num,num+5);//1 2 3 4 5
vector<int> vv5(vv4.begin(),vv4.end());//begin指向第一个元素,end指向最后一个元素的下一个
vector<int> vv6(vv3);
vector<int> vv7;
vv7 = vv2;
int i;
for (i = 0; i < vv4.size(); i++)
cout << vv4[i] << " ";
cout << endl;
vv4[3] = 20;
for (i = 0; i < vv4.size(); i++)
cout << vv4[i] << " ";
cout << endl;
vv1.push_back(1);
vv1.push_back(2);
vector<int>::iterator iter;//iter是iterator类型的变量+66666669
for (iter = vv1.begin(); iter != vv1.end(); iter++)
cout << *iter << " ";
cout << endl;
cout << "front" << vv1.front() << endl;//输出第一个
cout << "back" << vv1.back() << endl;//输出最后一个
vv1.assign(5, 6);//重新赋值
vv1.assign(num, num + 5);
vv1.assign(vv4.begin(), vv4.begin() + 3);
copy(vv4.begin(), vv4.end(), ostream_iterator<int>(cout, " "));
cout << endl;
//for_each(vv4.begin(), vv4.end(), Print);
cout << endl;
//int* p = num; p++;//指针
cout << "用copy实现:" << endl;
copy(vv4.begin(), vv4.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "用for_each实现:" << endl;
for_each(vv4.begin(), vv4.end(), print);
cout << endl;
for_each(vv4.begin(), vv4.end(), Print<int>());
for_each(vv4.begin(), vv4.end(), sum);
cout << "g_sum = " << g_sum << endl;
vv1.at(2) = 50;
cout << "at:" << "[]" << vv1.at(2) << endl;//vv1[1]
vv1.clear(); //清空
cout << "vv1.size = " << vv1.size() << endl;
vv4.emplace(vv4.begin(), 100);
vv4.emplace_back(200);
vv4.erase(vv4.begin() + 2, vv4.begin() + 4);
vv4.erase(vv4.begin());
vv4.insert(vv4.begin(), 5, 10);
vv4.insert(vv4.begin() + 4, num, num + 5);
vv4.push_back(300);
vv4.push_back(500);
vv4.swap(vv1);
// iter++;
// list<int> ::iterator iter1;
// iter1++;
//int* p = num; *p++
}
运行结果
四、具体实例代码
class Student
{
public:
Student(int num = 0, string name = "") :m_num(num), m_name(name) {}
int GetNum()const
{
return m_num;
}
string GetName()const
{
return m_name;
}
private:
int m_num;
string m_name;
};
bool cmp(Student& a, Student& b)
{
return a.GetNum() < b.GetNum();
}
void main()
{
vector<Student> vs;
vs.push_back(Student(1001, "aaa"));
vs.push_back(Student(1007, "fff"));
vs.push_back(Student(1002, "bbb"));
vs.push_back(Student(1003, "ccc"));
vector<Student>::iterator iter;
for (iter = vs.begin(); iter != vs.end(); iter++)
{
//cout << iter->GetNum() << " " << iter->GetName() << " " << endl;
cout << (*iter).GetNum() << " " << (*iter).GetName() << endl;
}
sort(vs.begin(), vs.end(), cmp);
cout << "sort:" << endl;
for (iter = vs.begin(); iter != vs.end(); iter++)
{
//cout << iter->GetNum() << " " << iter->GetName() << " " << endl;
cout << (*iter).GetNum() << " " << (*iter).GetName() << endl;
}
}
运行结果