stl中容器、算法、迭代器的3大概念
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
#include <windows.h>
#include "vector" //容器 vector
#include "algorithm" //迭代器
using namespace std;
//1。容器:把你的元素copy到容器中,实现了数据结构与算法的分离
//2.迭代器:相当于一个指针
//3.算法:
int main()
{
//容器
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
//利用迭代器进行遍历
//迭代器 iterator 指向 v1的首元素地址
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << endl;
}
//算法:别人写好的
int num = count(v1.begin(), v1.end(), 1);//算法 count 统计v1中等于1的数的个数
cout << num << endl;
system("pause");
return 0;
}
vector:
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
#include <windows.h>
#include "vector"
using namespace std;
//1.vector是一个将元素置于动态数组中加以管理的容器
//2.vector可以随机存取元素(支持索引值直接存取,用[]操作或at()方法)
//3.vector尾部添加或移除元素会很快,但是在中部或头部插入或移除元素比较费时
//vector采用模板类实现,vector对象的默认构造形式:vector<T> vecT;
//class CA{};
//vector<CA*> vecpCA; //用于存放CA对象的指针的 vector容器
//vector<CA> vecCA; //用于存放CA对象的 vector容器
//由于容器元素的存放是按值赋值的方式进行,所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常
void main01()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
cout << "头部元素:" << v1.front() << endl;//获取头部元素,返回的是引用,可以当做左值
while (v1.size() > 0)
{
cout << v1.back() << endl; //获取vector尾部元素
v1.pop_back(); //删除尾部元素
}
}
//vector 初始化
void main02()
{
//1.
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
//2
vector<int> v2 = v1;
vector<int> v3(10);//主动要求分配内存
v3.push_back(100);
v3.push_back(200); //放到底部,所以长度变成12,前十个为 0
}
//vector 遍历
void main03()
{
vector<int> v3(3);//主动要求分配内存
for (int i = 0; i < 3; i++)
{
v3[i] = i+1;
}
//迭代器遍历
// 迭代器end()的理解
//当 it == v3.end() 时,说明这个容器已经遍历完毕了,所以 end()的位置,在 vector尾部元素的后面
for (vector<int>::iterator it = v3.begin(); it != v3.end(); it++)
{
cout << *it <<" ";
}
//迭代器种类
//逆向遍历
for (vector<int>::reverse_iterator rit = v3.rbegin(); rit != v3.rend(); rit++)
{
cout << *rit << " ";
}
}
//vector 删除
void main04()
{
vector<int> v1(10);//主动要求分配内存
for (int i = 0; i < 10; i++)
{
v1[i] = i + 1;
}
//区间删除
//v1.erase(v1.begin(), v1.begin() + 3);//从开头删除3个
//指定元素删除
//v1.erase(v1.begin());
for (vector<int>::iterator it = v1.begin(); it != v1.end();)
{
if (*it == 2)
{
it = v1.erase(it); //当删除迭代器所指向的元素的时候,erase删除函数会返回下一个元素的指针,让it去接,实现自动下移
}
else
{
it++;
}
}
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << " ";
}
}
//插入
void main05()
{
vector<int> v1(10);//主动要求分配内存
for (int i = 0; i < 10; i++)
{
v1[i] = i + 1;
}
v1.insert(v1.begin(), 100); //在v1的begin插入 100
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << " ";
}
}
int main()
{
//main01();
main05();
system("pause");
return 0;
}
deque:
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
#include <windows.h>
#include "deque"
using namespace std;
//deque 双端数组, 可以在头部和尾部进行插入和删除 push_back(),pop_back(),push_front(),pop_front()
//vector只能在尾部插入和删除
void pritD(deque<int> &d)
{
for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
{
cout << *it <<" ";
}
}
void main01()
{
deque<int> d1;
d1.push_back(3);
d1.push_back(5);
d1.push_front(-1);
d1.push_front(-2);
pritD(d1);
//查找值为 5 的数组下标值
// find 返回一个迭代器
deque<int>::iterator it = find(d1.begin(), d1.end(), 5); //从d1 的开始到结束,查找5
if (it != d1.end())
{
cout << "值为5的下标为: " <<distance(d1.begin(),it); //偏移量,从d1的开始 ,偏移 it
}
else
{
cout << "没有找到" << endl;
}
}
int main()
{
main01();
system("pause");
return 0;
}
stack 和 queue
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
#include <windows.h>
#include "stack"
#include "queue"
using namespace std;
//stack 元素先进后出
void main01()
{
stack<int> s1;
//入栈
for (int i = 0; i < 10; i++)
{
s1.push(i + 1);
}
cout << "栈的大小: " << s1.size() << endl;
//出栈
while (!s1.empty())
{
int temp = s1.top(); //获取栈顶元素
cout << temp << endl;
s1.pop(); //弹出栈顶元素
}
}
//queue 队列模型: 元素先进先出
void main02()
{
queue<int> q;
//入栈
q.push(1);
q.push(2);
q.push(3);
cout << "队头元素:" << q.front() << endl;
cout << "队列大小:" << q.size() << endl;
//出栈
while (!q.empty())
{
cout << q.front() << " ";
q.pop();
}
}
int main()
{
//main01();
main02();
system("pause");
return 0;
}