C++ STL

STL(Standard Template Liblrary),标准模板库。
一、顺序容器
这里写图片描述
vector

这里写图片描述
内存分配由allocator完成。

int main()
{
    vector<int> vec1;
    if(vec1.empty())
    {
        cout<<"vec1 is empty"<<endl;
    }
    vec1.push_back(1);
    vec1.push_back(22);
    vec1.push_back(5);
    vec1.push_back(65);
    vec1.push_back(7);

    sort(vec1.begin(),vec1.end());

    vector<int>::iterator it = vec1.begin();
    for(; it!=vec1.end(); ++it)
    {
        cout<<*it<<" ";
    }
    cout<<endl;

    it = find(vec1.begin(),vec1.end(),5);
    if(it == vec1.end())
    {
        return -1;
    }

    vec1.erase(it);
    //erase();删除一个或几个元素,传入一个迭代器进去
    //clear();清除容器中所有元素

    vec1.insert(it,99);
    //容器里面有元素改动时,迭代器就失效了
    //在某位置增加/删除元素,该位置之后的所有迭代器失效
    //对于扩容的情况,所有迭代器都失效(已经不是原来的内存了)

    sort(vec1.begin(),vec1.end(),greater<int>());
    //传入一个函数对象改变其排序方式
    //greater<int>()降序排列;less<int>()升序

    it = find_if(vec1.begin(),vec1.end(),bind1st(greater<int>(),50));
    //find_if有条件的查找
    //绑定器bind1st();bind2nd();
    if(it == vec1.end())
        return -1;

    cout<<*it<<endl;

    for(it=vec1.begin(); it!=vec1.end(); ++it)
    {
        cout<<*it<<" ";
    }
    cout<<endl;

    vector<int> vec2;
    //vec2.swap(vec1);
    copy(vec1.begin(),vec1.end(),vec2.begin());//
    //copy(vec1.begin(),vec1.end(),inserter(vec2,vec2.begin()));
    for(it=vec2.begin(); it!=vec2.end(); ++it)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
    return 0;
}

deque
这里写图片描述
二、关联容器
增、删、查、改时间复杂度都是log以2为底n的对数

int main()
{
    /*
    set<int> myset;
    for(int i = 0; i<10; ++i)
    {
        myset.insert(rand()%100);
    }
    copy(myset.begin(),myset.end(),ostream_iterator<int>(cout," "));
    //红黑树本身就有序
    cout<<endl;
    set<int>::iterator it = myset.find(51);
    if(it == myset.end())
        return -1;
    cout<<*it<<endl;

    cout<<myset.count(5)<<endl;
    */
    map<string,string> map1;
    map1.insert(make_pair("101","zhang"));
    map1.insert(make_pair("102","wamh"));
    map1.insert(make_pair("103","li"));
    map1.insert(make_pair("104","zhao"));

    map1["104"] = "wu";

    map<string,string>::iterator it = map1.find("101");
    if(it == map1.end())
    {
        return -1;
    }
    cout<<"key:"<<it->first<<" val:"<<it->second<<endl;

    return 0;
}

三、容器适配器
所谓容器适配器就是对已有容器的一种封装,底层并没有自己的数据结构。stack和queue底层是deque,priority_queue插入元素时,是自动按优先级顺序插入,使最高优先级元素首先从优先级对列中取出,其以vector为基础数据结构。

四、泛型算法
修改容器的算法,即变化序列算法:copy()、 remove()、 replace() 、 swap()等。
不修改容器的算法,即非变化序列算法:count() 、find()等。

五、迭代器
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
反转型迭代器reserve_iterator
这里写图片描述

插入型迭代器
bake_insert_iterator:将元素添加到类型为T的容器对象的末端;
front_insert_iterator:将元素添加到类型为T的容器对象的前端;
insert_iterator

int main()
{
    /*
    vector<int> vec;
    for(int i = 0; i < 20; ++i)
    {
        vec.push_back(rand()%100);
    }
    copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
    */
    vector<int> vec;
    copy(istream_iterator<int>(cin),
        istream_iterator<int>(),//一个无效的流,表示流结束
        back_inserter(vec));
    sort(vec.begin(),vec.end());
    copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
    return 0;
}

这里写图片描述
常量迭代器

vector<int>::const_iterator it = vec.begin();
//const修饰所指的元素,不能解引用修改其值
const vector<int>::iterator it = vec.begin();
//修饰iterator,即it,其指向不能变

六、函数对象/仿函数
函数对象是一个类,它重载了函数调用操作符(operator())。
函数对象与函数指针相比较有三个优点:第一,函数指针是间接引用,不能作为内联函数,而函数对象可以,这样速度更快;第二,函数对象可以拥有任意数量的额外数据,用这些数据可以用来缓冲当前数据和结果,提高运行质量,当然多数情况下不一定使用;第三,编译时对函数对象作类型检查。

逻辑函数对象,这里Type必须支持逻辑运算,有两个参数。
逻辑与:logical_and //对应&&
逻辑或:logical_or //对应||
逻辑非:logical_not //对应!
关系函数对象,它们的返回值为布尔量,两个参数,第一参数和第二参数相比:
等于:equal_to
不等于:not_equal_to
大于:greater
大于等于:greater_equal
小于:less
小于等于:less_equal
返回布尔值的函数对象称为谓词(predicate),默认的二进制谓词是小于比较操作符“<”,所以默认的排序方式都是升序排列,它采用小于比较形式。

七、绑定器
1.绑定器(binder):把二元函数对象中的一个参数固定(绑定),使之转为一元函数,C++标准库提供两种预定义的binder适配器:bind1st和bind2nd,分别绑定了第一或第二个参数。
2.取反器(negator):把函数对象的值翻转的适配器,如原来为小于,用了它后就变成了大于。C++标准库也提供了两种negator适配器:not1和not2。not1用于一元预定义函数对象;not2用于二元预定义函数对象。
所有泛型算法的前两个实参是一对iterator,通常称为first和last,它们标出要操作的容器或内置数组中的元素范围。元素的范围,包括first,但不包含last的左闭合区间。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值