容器与算法

来源:互联网 发布:windows10 mac主题 编辑:程序博客网 时间:2024/06/06 08:57

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的数

原创粉丝点击