STL标准库-容器-forward_list

技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性。

forward_list即单向list,功能少额外开销就小.而且只能在前段插入元素

结构如下


一 定义

#include <forward_list>

int main(int argc, const char * argv[]) {

    //a.定义 list<typeName> name;
    forward_list<int> l;
    
    //b.拷贝构造
    forward_list<int> l1(l);
    
    //c.拷贝赋值
    l1 = l;
    
    //d.按指定元素个数定义 含五个默认值是0的元素的链表
    forward_list<int> l2(5);
    
    //e.指定元素个数及类型 含有5个值为2的链表
    forward_list<int> l3(5,2);
    
    //f.指定赋值区域
    forward_list<int> l4(l1.begin(),l1.end());
    
    for(auto i : l)
    {
        cout<< i << endl;
    }

    return 0;
}

二 与迭代器的使用

由于forward_list的迭代器内指向内存不连续 顾不能做迭代器 "+", "-" 操作

int main()
{
    forward_list<int> l = {1,2,3,4,5,6,7,8,9,10};
    
    //返回迭代器开始之前的位置
    l.before_begin();
    
    //返回第一个元素地址
    l.begin();
    
    //返回最后一个元素的下一个位置
    l.end();
    
    //返回迭代器开始之前的位置
    l.cbefore_begin();
    
    //返回第一个元素地址
    l.cbegin();
    
    //返回最后一个元素的下一个位置
    l.cend();
    return 0;
}

三 容量

int main()
{
    forward_list<int> l = {1,2,3,4,5,6,7,8,9,10};
    
    //返回forward_list是否为空
    cout << l.empty() << endl;
    
    //forward_list的最大容量
    cout << l.max_size() << endl;
    
    return 0;
}

四 元素访问

int main()
{
    forward_list<int> l = {1,2,3,4,5,6,7,8,9,10};
    
    //返回第一个元素
    cout<< l.front() <<endl;
    
    return 0;
}

五 操作

int main()
{
    forward_list<int> l = {1,2,3,4,5,6,7,8,9,10};
    iterator<forward_list<int>, int> i;
    for(auto i : l)
    {
        
        cout << i << " ";
    }
    cout<<"初始化"<<endl;
    
    //给l赋值成10个1
    l.assign(10, 1);
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"assign()"<<endl;
    
    //前段插入0
    l.push_front(0);
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"push_front()"<<endl;
    
    //在头部插入一组 参数为emplace_front(initializer_list<>) 初始化1
    l.emplace_front(1);
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"emplace_front()"<<endl;
    
    //弹出第一个元素
    l.pop_front();
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"pop_front()"<<endl;
    
    //在指定位置后面插入一组数据
    l.emplace_after(l.begin(), 0);
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"emplace_after()"<<endl;

    //在指定位置后面插入一组数据
    l.insert_after(l.begin(), 0);
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"insert_after()"<<endl;
    
    //在指定位置之后插入元素
    l.insert_after(l.begin(), 11);
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"insert_after()"<<endl;
    
    //删除指定位置
    l.erase_after(l.begin(),l.end());
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"erase_after()"<<endl;

    //交换并释l2
    forward_list<int> l2 = {10,10,10,10};
    l.swap(l2);
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"swap()"<<endl;

    //重新设定内存,不足补齐, 超过弹出尾部
    l.resize(5,20);
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"resize()"<<endl;

    //清空
    l.clear();
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"clear()"<<endl;

    return 0;
}

六 修改操作

int main()
{
    //指定位置拼接链表
    forward_list<int> l = {1,2,3,4,5,6,7,8,9,10};
    forward_list<int> l1 = {0,1,2,3,4,5,6,7,8,9,10};
    
    l.splice_after(l.before_begin(), l1);
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"splice_after()"<<endl;
    
    //删除指定元素
    l.remove(10);
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"remove()"<<endl;
    
    //按指定条件删除
    l.remove_if([](int x){return x<8;});
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"remove_if()"<<endl;
    
    //排序 <
    l.sort();
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"sort(<)"<<endl;
    
    l.sort([](int first, int second){return first > second;});
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"sort(>)"<<endl;
    
    //删除重复元素
    l.unique();
    for(auto i : l)
    {
        cout << i << " ";
    }
    cout<<"unique()"<<endl;
    
    forward_list<int> l2 = {1,2,3,4,4,5,5,6,6,7,8,9,10};
    
    //按指定要求删除元素(排序后)
    l2.unique([](int x, int y) { return (x == y) && (x < 6);});
    for(auto i : l2)
    {
        cout << i << " ";
    }
    cout<<"unique([])"<<endl;

    forward_list<int> l3 = {1,3,5,7};
    forward_list<int> l4 = {2,4,6,8};
    //合并两个有序forward_list 合并后仍然有序
    l3.merge(l4);
    for(auto i : l3)
    {
        cout << i << " ";
    }
    cout<<"merge()"<<endl;
    
    //翻转
    l3.reverse();
    for(auto i : l3)
    {
        cout << i << " ";
    }
    cout<<"reverse()"<<endl;
    
    //交换 多退少补 并释放l
    l3.swap(l);
    for(auto i : l3)
    {
        cout << i << " ";
    }
    cout<<"reverse()"<<endl;
    
    return 0;
}
原文地址:https://www.cnblogs.com/LearningTheLoad/p/7446482.html