目录
1基本概念:
- STL标准模板库
- STL从广义上分为1容器2算法3迭代器
- 容器和算法之间通过迭代器进行无缝衔接
- STL六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器
容器:
用最广泛的一些数据结构实现出来的
数组、链表、树、栈、队列、集合、映射表等
算法:这个都理解啊
就是分为质变和非质变
迭代器:
算法通过迭代器来访问容器中的元素
可以理解为迭代器就是指针
1:vector容器案例:
#include<iostream>
using namespace std;
#include<vector>
int main()
{
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<<" ";
itbegin++;
}
//这是利用了迭代器
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>//标准算法的头文件
void my_print(int val)
{
cout<<val<<" ";
}
int main()
{
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<<" ";
// itbegin++;
// }
for_each(v.begin(), v.end(), my_print);
}
//利用STL的算法;
2:string容器
1:拼接:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>//标准算法的头文件
#include<string>
int main()
{
string str1;
string str2;
str1="woai";
// str2="youxi";
// str1+=str2;
// cout<<str1;
str1.append("youxi");
cout<<str1;
}
//string容器的拼接;
append(字符串,起始位置,末尾位置)
只截取起始位置不截取末尾位置
2:查找和替换:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>//标准算法的头文件
#include<string>
int main()
{
string str1;
string str2;
// str1="woai";
// str2="youxi";
// // str1+=str2;
// // cout<<str1;
// str1.append(str2,0,3);//他这个末尾是不截取的直截取开头;
// cout<<str1;
str1="I love You";
int pos=str1.find("lo");
cout<<pos;//返回你所查找到的字符串的起始位置
//rfind是从右侧开始查找find是从左往右查找;
}
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>//标准算法的头文件
#include<string>
int main()
{
string str1;
string str2;
str1="I love You";
str1.replace(0,1,"yushqi");// 从0号字符起1个字符替换为“yushiqi”
cout<<str1;
// insert(pos,char):在制定的位置pos前插入字符char
s1.insert(s1.begin(),'1');
int pos;
pos=str1.find(str2);//寻找操作
cout<<pos<<endl;
str1.insert(pos,str2);//插入操作
cout<<str1;
str1.erase(pos,str2.size());//删除操作
reverse(str1.begin(),str2.end())//整体逆序;
cout<<str1;
}
先不学string和vector了我现在要用其他的以后学了再补充
stack容器:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>//标准算法头文件
#include<stack>
int main()
{
stack<int> stk;
stk.push(10);
stk.push(40);
stk.push(30);
stk.push(20);//入栈
while(!stk.empty())//判断栈空空返回1;
{
cout<<stk.top()<<endl;//返回栈顶元素;
stk.pop();//弹栈
}
cout<<stk.size()<<endl;//返回栈的大小;
}
Queue容器:(队列)
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
queue<double>Q;
int i;
for(i=0;i<3;i++)
{
Q.push(i+5.3);
}
while(!Q.empty())//判断队列为不为空
{
cout<<Q.front()<<" ";//查看对头元素;
cout<<Q.back()<<" ";//查看队尾元素;
Q.pop();//弹出对列;
}
cout<<Q.size();//队列大小;
}
list容器(链表):
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#include<list>
void print_list(list<int>&l1)
{
for(list<int>::iterator it=l1.begin();it!=l1.end();it++)
{
cout<<*it<<" ";
}
}
int main()
{
//防止修改容器加const;
//构造链表有好几种形式:
//默认构造
list<int>l1;
int i=0;
for(;i<3;i++)
{
l1.push_back(i+10);
}
print_list(l1);//遍历l1
//区间构造
list<int>l2(l1.begin(),l1.end());
print_list(l2);
//拷贝构造:
list<int>l3(l1);
print_list(l3);
cout<<endl;
}
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#include<list>
void print_list(const list<int>&l1)//加const是防止l1被修改;
{
for(list<int>::const_iterator it=l1.begin();it!=l1.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
int main()
{
list<int>l1;
int i=1;
for(;i<5;i++)
{
l1.push_back(i+20);
}
print_list(l1);
list<int>l2;list<int>l3;list<int>l4;
l2=l1;
print_list(l2);
l3.assign(l2.begin(),l2.end());
print_list(l3);
l4.assign(10,100);
print_list(l4);//这些都是赋值操作;
l1.swap(l4);
print_list(l1);
print_list(l4);//链表的交换
}
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#include<list>
void print_list(const list<int>&l1)//加const是防止l1被修改;
{
for(list<int>::const_iterator it=l1.begin();it!=l1.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
int main()
{
list<int>l1;
int i=0;
for(;i<4;i++)
{
l1.push_back(i+20);//尾插法;
}
print_list(l1);
cout<<l1.size()<<endl;
if(!l1.empty())
{
cout<<"no empty"<<endl;
}
else
{
cout<<"empty"<<endl;
}
l1.resize(10);//改变链表大小;
print_list(l1);
}
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#include<list>
void print_list(const list<int>&l1)//加const是防止l1被修改;
{
for(list<int>::const_iterator it=l1.begin();it!=l1.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
int main()
{
//list容器的插入和删除
list<int>l1;
int i=0;
for(;i<4;i++)
{
l1.push_back(i+20);//尾插法;
}
print_list(l1);
l1.push_front(100);//头插;
print_list(l1);
l1.pop_back();//尾删;;
print_list(l1);
l1.pop_front();
print_list(l1);
//头删;
//插入;
list<int>::iterator it=l1.begin();//先给一个迭代器移动然后插入
l1.insert(++it,130);
l1.insert(++it,130);l1.insert(++it,130);
print_list(l1);
//移除:
l1.remove(130);
print_list(l1);
//清空:
l1.clear();
print_list(l1);
}
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#include<list>
void print_list(const list<int>&l1)//加const是防止l1被修改;
{
for(list<int>::const_iterator it=l1.begin();it!=l1.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//列表迭代器可以双向访问;并且不可跳跃不支持随机访问
int main()
{
list<int>l1;
int i=0;
for(;i<5;i++)
{
l1.push_back(i+10);
}
// cout<<l1.back()<<endl;
// cout<<l1.front()<<endl;
//排序,反转
print_list(l1);
l1.reverse();//这是一个反转的操作
print_list(l1);
list<int>l2;
l2.push_back(10);
l2.push_back(90);
l2.push_back(100);
l2.push_back(80);
print_list(l2);
l2.sort();//默认是升序;
print_list(l2);
// l2.sort();
}
set容器(集合容器)
void print_set(set<int>&s)
{
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
cout<<(*it)<<" ";
}
cout<<endl;
}
int main()
{ set<int>s;
s.insert(10);
s.insert(230);//set容器的插入
s.insert(23);
s.insert(30);
print_set(s);
set<int>s1;
if(!s.empty())//判断是否为空
{
cout<<"s不为空"<<endl;
}
s1.insert(12);
s1.insert(18);//插入
s1.insert(19);
s1.insert(14);
print_set(s1);
cout<<s.size()<<endl;//大小
cout<<s1.size()<<endl;
s.swap(s1);//交换
print_set(s);
print_set(s1);
it=s.begin();//set容器的删除
it++;
s.erase(it);
print_set(s);
//clear()清空
set<int>::iterator pos=s.find(230);//fing返回一个迭代器并且没找到的话输出的是末尾迭代器
if(pos==s.end())
{
cout<<"meizhaodao"<<endl;
}
else
{
cout<<*pos<<endl;//输出迭代器所对应的内容
}
//创建队组pair;
pair<string,int>p=make_pair("yushiqi",18);
cout<<p.first<<p.second<<endl;
}
//set容器不会重复而且会自动排序可以理解为集合容器//不做赘述了和其他容器接口基本一致
map容器、string、vector后续在更