C ++ первое знакомство с STL Сяобая
Нечего и говорить, время ежедневной уборки истекло. Сегодня я хочу привести в порядок STL (стандартная библиотека шаблонов). Я немного знаю об этом, и я думаю, что STL действительно прост в использовании o (  ̄  ̄  ̄ ) ブ. Сегодня я впервые знакомлюсь со STL, так что подведем итоги.
1. STL initial - основная концепция
STL 1.1. Рождение STL
(1) В течение долгого времени индустрия программного обеспечения надеялась создать многоразовую вещь.
(2) Идеи объектно-ориентированного и универсального программирования C ++ нацелены на улучшение возможности повторного использования.
(3) В большинстве случаев структуры данных и алгоритмы не соответствуют набору стандартов, что вынуждает выполнять много повторяющейся работы.
(4) Чтобы установить набор стандартов для структур данных и алгоритмов, родился STL.
1.2 Основные понятия STL
(1) STL (стандартная библиотека шаблонов, стандартная библиотека шаблонов)
(2) STL можно в общих чертах разделить на: контейнер (контейнер), алгоритм (алгоритм), итератор (итератор)
(3) между контейнером и алгоритмом. через итераторы
(4) Почти все коды STL используют классы шаблонов или функции шаблонов
1.3 Шесть компонентов
STL STL примерно разделен на шесть компонентов, а именно: контейнер, алгоритм, итератор, функтор, адаптер (адаптер), пространственный адаптер
1. Контейнер: различные структуры данных, такие как vector, list, deque, Set, map. , так далее. Используется для хранения данных.
2. Алгоритм: различные часто используемые алгоритмы, такие как сортировка, поиск, копирование, for_each и т. Д.
3. Итератор: он действует как клей между контейнером и алгоритмом.
4. Функторы: аналогичные функции могут использоваться в качестве стратегии для алгоритмов.
5. Адаптер: вещь, используемая для украшения интерфейса контейнера, функтора или итератора.
6. Адаптер пространства: отвечает за настройку и управление пространством.
1.4 Контейнеры, алгоритмы и итераторы в
контейнерах
STL : место хранения. Контейнеры STL реализуют наиболее широко используемую структуру данных.
Часто используемые структуры данных: массивы, связанные списки, числа, стеки, очереди, множества, таблицы сопоставления и т. Д.
Эти контейнеры делятся на два типа: контейнер последовательности и ассоциативный контейнер: контейнер
последовательности: подчеркивает порядок значений, каждый элемент в контейнере последовательности имеет фиксированное положение.
Ассоциативный контейнер: двоичная древовидная структура, между элементами нет строгого отношения физического порядка.
Алгоритм: Решение проблемы также имеет
ограниченные шаги для решения логических или математических задач. Мы называем этот предметный алгоритм (Алгоритмы).
Алгоритмы делятся на качественные и некачественные алгоритмы.
Алгоритм качественного изменения: это означает, что содержимое элементов в интервале будет изменено во время операции, такой как копирование, замена, удаление и т. Д.
Некачественный алгоритм: это означает, что содержимое элемента в интервале не будет изменяться во время операции, такой как поиск, подсчет, обход, поиск экстремальных значений и т. Д.
Итератор: связующее звено между контейнером и алгоритмом.
Предоставляет способ последовательного поиска различных элементов, содержащихся в контейнере, без раскрытия внутреннего представления контейнера.
У каждого контейнера есть свой
итератор. Использование итераторов очень похоже на указатели. На начальном этапе вы можете понять, что итераторы - это указатели.
Типы
итераторов : итераторы ввода
Обычно используемые типы итераторов в контейнерах - это двунаправленные итераторы и итераторы с произвольным доступом.
1.5 Vector хранит встроенные типы данных
Контейнер: векторный
алгоритм: for_each
итератор: vector :: iterator
Заголовочный файл алгоритма STL: #include <algorithm>
три итератора обхода и тестовый код:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void myPrint(int val)
{
cout<<val<<endl;
}
void test01()
{
//创建了一个vector容器,数组
vector<int> v;
//向容器中插入数据
v.push_back(10);
v.push_back(11);
v.push_back(12);
v.push_back(13);
v.push_back(14);
//通过迭代器访问容器中的数据
vector<int>::iterator itBegin=v.begin();//起始迭代器 指向容器中第一个元素
vector<int>::iterator itEnd=v.end();//结束迭代器 指向容器中最后一个元素的下一个位置
//第一种遍历方式
while(itBegin!=itEnd)
{
cout<<*itBegin<<endl;
itBegin++;
}
//第二种遍历方式
for(vector<int>::iterator it=v.begin();it !=v.end();it++)
{
cout<<*it<<endl;
}
//第三种遍历方式 利用STL提高遍历算法
for_each(v.begin(),v.end(),myPrint);//需要在声明一个myPrint的函数
}
int main()
{
test01();
system("pause");
return 0;
}
1.6 Демонстрационный код для хранения пользовательских типов данных в векторе выглядит
следующим образом:
#include<iostream>
using namespace std;
#include<vector>
#include<string>
//vector容器中存放自定义数据类型
class Person
{
public:
Person(string name,int age)
{
this->m_Name=name;
this->m_Age=age;
}
string m_Name;
int m_Age;
};
void test01()
{
vector<Person>v;
Person p1("wjx",11);
Person p2("p",11);
Person p3("苏",10);
Person p4("re",11);
Person p5("tyu",11);
//向容器中添加数据
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
//遍历容器中的数据
for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
{
cout<<"姓名:"<<(*it).m_Name<<"年龄:"<<(*it).m_Age<<endl;
cout<<"姓名:"<<it->m_Name<<"年龄:"<<it->m_Age<<endl;
}
}
void test02()
{
vector<Person*>v;
Person p1("wjx",11);
Person p2("py",11);
Person p3("苏",10);
Person p4("re",11);
Person p5("tyu",11);
//向容器中添加数据
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
//遍历容器
for(vector<Person *>::iterator it=v.begin();it!=v.end();it++)
{
cout<<"姓名:"<<(*it)->m_Name<<"年龄:"<<(*it)->m_Age<<endl;
}
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
1.7 Вложенный контейнер контейнера.
Подобно вызову двумерного массива, код использования выглядит следующим образом:
разделен на общий большой контейнер и маленький контейнер, содержащийся в большом контейнере.
#include<iostream>
using namespace std;
#include<vector>
//容器嵌套容器
void test01()
{
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()
{
test01();
system("pause");
return 0;
}