STL容器
stl 容器 算法 迭代器 仿函数 适配器 空间配置器
创建容器vector<int>v;//int类型可转为其他类型
放int型,自定义类型,指针类型(vector<Person *> v;),容器
创建数据
把数据放到容器内push_back
指针类型v.push_back(&p1);
遍历:用到迭代器vector<int>::iterator it = v.begin()或者v.end();
while(要先创对象)
for
自定义类型 (*it).m_Name it->m_Age
指针类型(*it)->m_Name
for_each(加头文件algorithm,不用写输出)
容器嵌套:创建大容器vector<vector<int>>v;,创建小容器,创建数据,把数据放进小容器,把小容器放进大容器,遍历
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;//转行
}//it是大容器 *it=vit是小容器 *vit是小容器的数据
——————————————————————————————————————————————————————————————————————
string容器
str. assign(const char*s ,int n);//s 的前n个给当前字符串
str. assign(int n,char c);//n个c个当前字符串
取值 str[i]越界直接挂
str.at(i) 越界抛出out_of_range异常
拼接 str1+=str2
str1.append(“拼接内容”)
查找 str.find("要找得内容”)
str.rfind("")
替换 str.replace(1,3,"11111”)//从1 开始的3个字符换为11111
比较 stl1.compare(stl2) >0-==0<0
子串 str.substr(0,3)
插入 str.insert(1,"111");
删除 str.erase(1,3);//1位删除3个
转类型 const char * str="sbc"; string s(str),//char*转string
const char* str2=s.c_str();//string转char*
const char*可隐式转化为string 反之不行 void dowork(string str){} dowork(str2);
重新分配内存后之前的引用会出错:string s=”abc“;char& a = s[2]; s=”aaaaaa“//重新分配 a的引用出错
大写toupeer() 小写tolower()
——————————————————————————————————————————————————————————————————————
vector容器:单向开口连续空间,栈
动态扩展:重新分配空间,不是原有的后面扩展
v.resize (10,0)//10个空间 默认值为0,重置空间缩小,实际占存不变,若要缩小用swap
vector<int>(v).swap(v);//当前指针(现在的小空间)与匿名指针(原本大空间)交换后,匿名指针释放
v.reserve(int len)预留长度,不初始化,不可访问,预留长度,使后面动态扩展使不用频繁分配新空间
v.front()//第一个元素 v1,back()//最后一个元素
v.insert(位置,几个,值);
v.push_back(值)尾插 v.pop_back()尾删
v.erase(开始位置,结束位置)
v.clear()//清除
逆序遍历:for(vector<int>::reverse_iterator it=v.rbegin();it!=v.rend();it++){ cout<<*it<<endl}//迭代器2
跳跃式访问:vector<int>::iterator itBegin=v.begin(); itBgin =itBegin+3;
——————————————————————————————————————————————————————————————————————
deque容器,双向开口连续空间,类似邻接表(但是行和列是连续空间)或是文件索引表,列是中控器
大致与vector一样
for(vector<int>::const_iterator it=v.rbegin();it!=v.rend();it++){ cout<<*it<<endl}//只读迭代器
d.push_front(值); d.pop_front(); d.front() d.back()
d.erase(it1,it2)//it2
——————————————————————————————————————————————————————————————————————
栈
push pop top empty size栈无迭代器无遍历操作
队
push pop front back
链表list
push begin rbegin end rendl list迭代器不支持随机访问,可++ --
insert(位置,值) remove(值 )//对于自定义类型需要重载==号 reverse()//反转
sort(起点,终点)//排序 自定义必须制定规则:
bool mycomparePerson(Person&1,Person&2)
{return p1.m_Age>p2.m_Age;} 或者{if(p1.m_Age==p2.m_Age){return p1.m_Height<p2.m_Height}return p1.m_Age>p2.m_Age;}
L.sort(mycomparePerson);
——————————————————————————————————————————————————————————————————————
set容器 自动排序
s.find(key) //找到找不到都返回迭代器
s.count(值)//该值得个数,key不可重复,so返回值0/1
s.lower_bound(值)//下限值,找小于等于该值 s.upper_bound(值)
s.equal_range( key)//返回该值上下限的两个迭代器。
pair<set<int>::iterator,bool> ret=s.insert(10)//参数1迭代器,参数2表示是否插入成功。
multiset(值);可以插入重复值
set<int,函数>s//修改排序规则在实例化前,函数 operater()(重载)set<person,函数>自定义类型 函数是自定义排序规则——————————————————————————————————————————————————————————————————————map 关联式容器m.insert(pair<int,int>(1,10)); key=1 value=10m.insert(make_pair<int,int>(1,10));m.insert(map<int,int>::value_type(3,30);m[4]=40;//用于访问m.find(3)//找key为3 lower_bound upper_bound count equal_range it->first 是key值 it->second是value值——————————————————————————————————————————————————————————————————————伪函数、函数对象可以有自己的状态,可以作为参数,内联编译find_if (开始,结束,条件函数) 返回值为迭代器匿名函数:[ ](int val){cout<<val<<endl}谓词 返回为bool类型 一元/二元:几个参数 内建函数 #inculde<functional> negate<>.n n(10)//取反-10puls<>.p p(10,10)//10+10sort(起始为,终止为,排序函数)//greater<> binary2nd绑定两个数 not1一元取反(<变>) not2二元取反 greater大于 一下三步底层已近写好自定义的函数需要实现一下三步1#include<functional> 2一元继承:unary_function<int,bool> 二元继承:public binary function<int,int,void>//参数1类型,参数2类型,返回值类型3父类函数加const 一元取反not1 二元取反not2——————————————————————————————————————————————————————————————————————查找find返回值为迭代器 vecter<int> ::iterator pos=fing(v.begin(),v.end(),15);

浙公网安备 33010602011771号