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=10
m.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)//取反-10
puls<>.p  p(10,10)//10+10
sort(起始为,终止为,排序函数)//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);
posted @ 2023-03-07 17:26  cecel  阅读(40)  评论(0)    收藏  举报