C ++ первое знакомство с STL Сяобая

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;
}

рекомендация

отblog.csdn.net/qq_45252077/article/details/107915940