容器与算法

operator ():重载小括号

模板偏特化

模板中const:对类型进行严格检测
const T*指向一个常量的指针
1.类模板显示特化
2.默认模板参数
3.成员模板
4.模板类的成员函数可以是一个模板
已结有了vector添加成员,就需要成员函数

关键字typename:作为类型前的标识符
template
class MyClass
typename T::SubType * ptr;
指出subType是T中定义的一个类型,因此ptr是一个指向T::SubType的指针,如果不加tynename那么表达式被认为是T中的静态成员SubType和ptr的乘积
除了typename修饰以为,template内的任何标识符都可以被视为一个值,而非一个类型。
typename的第二个作用:在模板中替换关键字class
template class Test
容器:
序列式容器
vector deque list
关联式容器:
set multiset map multimap
vector
pushback分配内存
relloc:拷贝到新的内存,释放原来的内存

Vectors:将元素置于一个动态数组加以管理;
可以随机存取元素;
数组尾部添加或者移除元素非常快速,但是在中部或头部安插元素比较费时。
Deques:

不需要变长,容量较小可用到array;
需要变长,容量较大用到vector;

#include<iostream>
#include<list>
#include<stdio.h>
using namespace std;
int main() {
    list<int> mylist;
    mylist.push_back(1);
    mylist.push_back(2);
    mylist.push_back(3);
    mylist.push_back(4);
    auto ibegin = mylist.begin();    //指针,指向了一个迭代器,迭代器存储了一个位置
    auto iend = mylist.end();
    for (; ibegin != iend; ibegin++) {
        cout << *ibegin << endl;
        printf("%p\n", ibegin);
    }
    cin.get();
    return 0;
}

list中的删除erase()
mylist.erase(mylist.begin);

#include<iostream>
#include<list>
#include<stdio.h>
using namespace std;
int main() {
    list<int> mylist;
    mylist.push_back(1);
    mylist.push_back(2);
    mylist.push_back(3);
    mylist.push_back(4);
    auto ibegin = mylist.begin();    //指针,指向了一个迭代器,迭代器存储了一个位置
    auto iend = mylist.end();
    for (; ibegin != iend; ibegin++) {
    if((*ibegin)==3){
        mylist.erase(ibegin);
                break;         //删除后,迭代器的begin和end发生了变化,不break的话会发生中断异常
    }
    auto ibegin = mylist.begin();    //指针,指向了一个迭代器,迭代器存储了一个位置
    auto iend = mylist.end();
    for(;ibegin!=iend;ibegin++){
        cout << *ibegin << endl;
        printf("%p\n", ibegin);
    }

    }
    cin.get();
    return 0;
}

链式存储,不允许下标访问,只允许迭代器,链表迭代器只能使用++ –
如mylist[1]就是错误的,只能使用迭代器访问
clear:清空链表
push_back;
push_front;
mylist.insert(ibegin,30);// 位置,值
mylist.remove(); //remove是直接根据元素的值删除,如remove(30)就是删除值为30的元素。
删除或者插入跌代器的时候,begin和end都发生了变化,所以需要break;

mylist.rbegin();
mylist.rend();
mylist.merge(mylist2);//将链表合并 (合并之前必须要有序,mylist1.sort() mylist2.sort(),然后在merge),merge之后的list也是有序的。
mylist.unique();unique也依赖于排序
如果没排好序,那么仅会删除最后一个重复。如果sort了,那么会删除所有重复的。

set

myset.insert();
myset.find();

迭代器

迭代器本质是个指针,但是是经过优化的;ib类内部有个指针p,每次打印ib的值都是一样的,但是ib内部的值是拒绝访问的。

printf(“%p,%p\n”,ib, ib._Ptr); 0x1234564 0000000;
printf(“%p,%p\n”,ib._Ptr,ib); 每次的ib._Ptr值不一样,ib的值都是一样

struct print{
    void operator()(int x){
        std::cout<<x<<std::endl;
    }
};

for_each(a,a+5,print());//遍历每一个元素,用结构体封装了这个方法,然后进行重载
类模板需要实例化;
printf()是怎么发生作用的?
//等于调用print的()函数,for_each第三个参数是一个函数
//第三个参数是函数指针
//加上(),把类名当做函数名来使用
//类名当做函数名,重载了(),直接调用();

multiset

multiset.insert;
bind1st仿函数:可以实现一定的算法策略

auto ifind = find_if(mylist.begin(),mylist.end(),bind1st(greater(),3 )); //过滤>3的数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值