Stl Standard Library For Algorithm Fundamentals
算法STL基础
STL
包含容器、算法、迭代器、仿函数、适配器、空间适配器等。
vector存放内置数据类型和自定义数据类型
内置数据类型
vector<int>v1;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
{
cout<<*it;
}
//还可以通过for_each遍历,while循环遍历
自定义数据类型
class person{
public:
person(string name,int age)
{
mage=age;
mname=name;
}
public:
string mname;
int mage;
};
vector<person> v;
person p1("aaa",10);
person p2("bbb",10);
person p3("ccc",10);
person p4("ddd",10);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
for(vector<person>::iterator it=v.begin();it!=v.end();it++)
{
cout<<it->mname<<" "<<it->mage<<endl;
}
容器嵌套容器
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++)
{
for(vector<int>::iterator vit=(*it).begin();vit!=(*it).end();vit++)
{
cout<<*vit<<" ";
}
cout<<endl;
}
string容器
string构造函数
//无参构造,默认
string s;
//使用字符串s初始化
const char* str="hello";
string s1(str);
//使用一个string创建另一个string
string s2(s1);
//用n个字符初始化
string s3(10,'a');
string 赋值
//等号方法
string str1;
str1="hello";
string str2;
str2=str1;
string str3;
str3='1';
//assign方法
string str4;
str4.assign("hello");
str4.assign("hello c++",5);
str4.assign(str5);
str4.assign(10,'2');
字符串拼接
string str1="c++";
string str2="hello";
//+=重载
str1+="你好";
str1+=':';
str1+=str2;
//append
str1.append("love");
str1.append("game abcd",4)
str1.append(str2);
str1.append(str2,0,3)
字符串查找替换
//find
string str1="abcd";
int pos=str1.find("cd");
//rfind
int pos=str1/rfind("cd");
//rfinds是从右往左查找
str1.replace(1,3,"111");
字符串比较
string str1="hello";
string str2="hello";
str1.compare(str2);//-1 0 1
字符串存取
string str="hello"
for(int i=0;i<str.size();i++)
{
cout<<str[i];
}
for(int i=0;i<str.size();i++)
{
cout<<str.at(i);
}
//修改
str[0]='w';
str.at(1)='2';
字符串插入删除
string str="hello";
str.insert(1,"1111");
str.erase(1,4);
子串获取
string str1="hello";
str1.substr(1,3);
vector容器
动态数组。
构造
vector<Type>v;
vector<int>v2(v.begin(),v.end());
vector<int>v3(10,100);
vector<int>v4(v3);
赋值
vector<int>v;
for(int i=0;i<10;i++)
{
v.push_back(i);
}
vector<int>v1;
v1=v;
v1.assign(v.begin();v.end());
v1.assign(10;100);
容量大小
//empty,capacity,size,resize
vector<int>v1;
for(int i=0;i<10;i++)
{
v1.push_back(i);
}
v1.empty();//判断空
v1.capacity();//容量
v1.size();//有多少元素
v1.resize(15);//指定大小,没有的补上0,超出删掉
插入删除
vector<int>v1;
v1.push_back(1);
v1.pop_back();
v1.insert(v1.begin(),10);
v1.erase(v1.begin(),10);
v1.clear();
数据存取
vector<int>v;
v[0];
v.at(0);
v.front();
v.back();
互换容器
vector<int>v1;
vector<int>v2;
v1.swap(v2);
//收缩大小,v大小13万,插入三个数字
vector<int>(v).swap(v);
预留空间
vector<int>v;
//插入10万数
int num=0;
int *p=NULL;
for(int i=0;i<100000;i++)
{
v.push_back(i);
if(p!=&v[0])
{
p=&v[0];
num++;
}
}
v.reserve(100000);
deque容器
双端数组,可以对头尾进行插入删除操作。
构造
deque<int>d1;
d1.push_back(1);
d1.push_back(2);
赋值
deque<int>d1;
for(int i=0;i<10;i++)
{
deque.push_back(i);
}
deque<int>d2;
d2=d1;
d2.assign(d1);
大小操作
deque.empty();
deque.size();
deque.resize(num);
deque.ressize(num,ele);
插入删除
deque<int>d;
d.push_back(elem);//尾插
d.push_front(elem);//头插
d.pop_back();//尾删
d.front_front();//头删
d.insert();//指定位置插入指定个数的元素
d.clear();//全部删除
d.erase();//指定位置删除
数据存取
deque<int>d;
d[pos];
d.at(pos);
d.front();
d.back();
排序
deque<int>d;
sort(d.begin(),d.end());
stack容器
常用接口
先进后出的数据结构,弹匣。
stack<int>stk;
//入
stk.push(elem);
//查栈顶
stk.top();
//查大小
stk.size();
//出
stk.pop();
//判空
stk.empty();
queue容器
常用接口
先进先出。
queue<int>que;
//入队
que.push(elem);
//队头
que.front();
//队尾
que.back();
//出队
que.pop();
//队大小
que.size();
//判空
que.empty();
list容器
概念
双向循环链表!
构造函数
list<int>lst;
lst.push_back(10);
赋值交换
list<int>lst;
lst.push_back(10);
lst.push_back(20);
lst.push_back(30);
list<int>lst1;
lst1=lst;
lst1.assign(lst.begin(),lst.end());
lst1.assign(4,10);
lst1.swap(lst);
大小操作
list<int>lst;
lst.size();
lst.empty();
lst.resize(num);
插入删除
list<int>l;
l.push_back(10);
l.push_front(10);
l.pop_back();
l.pop_front();
l.insert();//指定位置插入指定元素
l.remove(value);
l.erase(迭代器);
l.clear();
数据存取
list<int>l;
l.front();
l.back();
反转排序
list<int>l;
l.reserve();
l.sort();
set容器
自动排序,不重复,二叉树实现。
构造赋值
set<int>s;
s1.insert(10);
s1.insert(30);
s1.insert(20);
set<int>s2;
s2=s;
大小交换
set<int>s;
set<int>s1;
s.size();
s.empty();
s.swap(s1);
插入删除
set<int>s;
s.insert(elem);
s.clear();
s.erase(pos);
s.erase(begin,end);
s.erase(elem);
查找统计
set<int>s;
s.find(key);//返回位置
s.count(key);//返回个数
set和multiset区别
后者可以插入重复值。
pair的使用
pair<type,type> p(value,value);
p.first;
p.second;
set内置类型排序
class mycompare
{
public:
bool operator()(int v1,int v2)
{
return v1>v2;
}
};
set<int>s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
set<int,mycompare>s2;
s2.insert(1);
s2.insert(2);
s2.insert(3);
s2.insert(4);
set自定义数据类型排序
class person
{
public:
person(string name,int age)
{
this->m_name=name;
this->m_age=age;
}
string m_name;
int m_age;
};
class mycompare
{
public:
bool operator()(const person& p1,const person& p2)
{
return p1.m_age>p2.m_age
}
};
set<person,mycompare>s;
person p1("aaa",1);
person p2("bbb",2);
person p3("ccc",3);
person p4("ddd",4);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
map容器
所有元素都是pair,第一个元素是key,第二个是value。 所有自动排序,二叉树实现,快速查找。 map不可重复key,multimap可以重复key。
构造、赋值
map<int,int>m;
m.insert(pair<int,int>(1,10));
大小、交换
map<int,int>m;
map<int,int>m2;
m.size();
m2.swap(m);
插入、删除
map<int,int>m;
m.insert(make_pair(2,20));
m[4]=40;
m.clear();
m.erase(pos);
m.erase(beigin,end);
m.erase(key);
查找、统计
map<int,int>m;
m.find(key);//返回位置
m.count(key);//返回个数
排序
class mycompare
{
bool operator()(int v1,int v2)
{
return v1>v2;
}
};
map<int,int,mycompare>m;