STL技术——STL概述和入门
STL介绍STL( standard template library),译为标准模板库或者泛型库,是 C++ 提供的一个基础模板的集合。STL 已完全被内置到支持 C++ 的编译器中,不用另外安装。STL广义上可以分为:容器container(本质上就是封装有数据结构的模板类)、算法algorithm、迭代器iterator;容器和算法之间通过迭代器无缝连接。
STL技术——STL概述和入门
1、STL简介
STL介绍
STL( standard template library),译为标准模板库或者泛型库,是 C++ 提供的一个基础模板的集合。
STL 已完全被内置到支持 C++ 的编译器中,不用另外安装。
STL广义上可以分为:容器container(本质上就是封装有数据结构的模板类)、算法algorithm、迭代器iterator;容器和算法之间通过迭代器无缝连接。
STL 就位于各个 C++ 的头文件中,即它并非以二进制代码的形式提供,而是以源代码的形式提供,并且STL几乎所有代码都采用了模板类或模板函数。
STL版本
因为STL是开源的,所以各个 C++ 编译器厂商在此标准的基础上都实现了满足自己需求的 C++ STL 泛型库,主要包括 HP STL、SGI STL、STLport、PJ STL、Rouge Wave STL 等。
STL六大组件
STL大体分为6大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
-
容器:各种数据结构,如vector(常用)、list、deque、set、map等,用来存放数据
-
算法:各种常见的算法,如sort、find、copy、for_each等
-
迭代器:扮演了容器和算法之间的粘合剂
-
仿函数:行为类似于函数,可做算法的某种策略
-
适配器:一种用来修饰容器或者仿函数或迭代器接口的东西
-
空间配置器:负责空间的配置和管理
容器种类和功能
序列式容器:主要包括 vector 向量容器、list 列表容器以及 deque 双端队列容器。由于元素在容器中的位置与元素的值没有关系,也就是说,容器没有被排列好,因此被称作序列式容器。当我们将一个元素插入到一个容器中时,要指定该元素所在的位置。
排序式容器:包括 set 集合容器、multiset多重集合容器、map映射容器以及 multimap 多重映射容器。在排序容器中,元素的预设顺序是从小到大,即使是在插入一个元素时,它们也会被插入到合适的地方。因此,当查询时,性能方面关联容器表现得很好。
哈希式容器:C++11 新加入 4 种关联式容器,分别是 unordered_set 哈希集合、unordered_multiset 哈希多重集合、unordered_map 哈希映射和 unordered_multimap 哈希多重映射。哈希式容器和排序容器不同的地方在于:哈希容器中的元素是未排序的,元素的位置由哈希函数确定。
2、入门案例
2.1、vecto存放内置数据类型
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
//回调函数
void myPrint(int val)
{
cout << val << endl;
}
void test1()
{
//创建int类型的容器
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();
//结束迭代器,指向容器最后一个元素的下一个位置
//vector<int>::iterator itEnd = v.end();
//while (itBegin!= itEnd)
//{
// cout << *itBegin << endl;
// itBegin++;
//}
//遍历容器方式二(常用):for循环
//for (vector<int>::iterator itBegin = v.begin(); itBegin!=v.end(); itBegin++)
//{
// cout << *itBegin << endl;
//}
//遍历容器方式三:foreach算法
for_each(v.begin(), v.end(), myPrint);
}
int main()
{
test1();
system("pause");
return 0;
}
push_back:在 vector 容器尾部添加一个元素
2.2、vecto存放自定义数据类型
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//vector存放自定义数据类型
class Person {
public:
Person(string name, int age) {
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
void myPrint(Person p)
{
cout << "姓名为" << p.m_Name << " 年龄为" << p.m_Age << endl;
}
void test01() {
Person p1("qq", 12);
Person p2("wq", 13);
Person p3("eq", 14);
Person p4("rq", 15);
Person p5("tq", 16);
vector<Person> v;
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
for_each(v.begin(), v.end(), myPrint);
}
//存放自定义数据类型的指针
void test02() {
Person p1("qq", 12);
Person p2("wq", 13);
Person p3("eq", 14);
Person p4("rq", 15);
Person p5("tq", 16);
vector<Person*> v;
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
vector<Person*>::iterator itBegin = v.begin();
vector<Person*>::iterator itEnd = v.end();
for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) {
cout << "姓名为" << (*it)->m_Name << " 年龄为" << (*it)->m_Age << endl;
}
}
int main() {
test01();
cout << "-----------------------" << endl;
test02();
system("pause");
return 0;
}
2.3、容器嵌套
#include<iostream>
using namespace std;
#include<vector>
//vector嵌套容器
void test03() {
vector<vector<int>> v;
//创建小容器
vector<int> v1;
vector<int> v2;
vector<int> v3;
vector<int> v4;
for (int i = 0; i < 4; i++) {
v1.push_back(i + 1);
v2.push_back(i + 2);
v3.push_back(i + 3);
v4.push_back(i + 4);
}
//把小容器放到大容器中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {
//(*it)----vector<int>
for (vector<int>::iterator vIt = (*it).begin(); vIt != (*it).end(); vIt++) {
cout << *vIt << " ";
}
cout << endl;
}
}
int main() {
test03();
system("pause");
return 0;
}
更多推荐
所有评论(0)