• 【ACM学习】【STL】顺序容器的基本功能


    14天阅读挑战赛

    前言

    由于本文涉及内容比较多,为了尽可能的讲详细些,会把各种例子附上,所以代码样例会比较多,也为了更好的布局,本系列将分开讲解,并且前期为了更加贴合实战需求,暂时只对一些常用的STL容器和基本功能进行讲解。

    为了使每篇文章具有一定的独立性,后续的文章大多数会将之前文章涉及的知识点中提取,并且在后续会将相应的例子补上。

    本文STL系列知识参考《C++语言程序涉及(第5版)》

    STL指南

    顺序容器的基本功能

    包括:vector , deque, list ,forward_list, array

    由于array大小固定,不支持添加和删除元素大小,forward_list有特殊的添加和删除操作,下文列出的基本功能均与这两种容器无关。

    构造函数

    除了使用默认构造函数外,还可以使用给定的元素构造,或者使用已有迭代器的区间所表示的序列来构造

    1. S s(n,t);

    构造一个由n个t元素构成的容器实例s

    int main() {
        vector<int>vec1(4,1);
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
    }
    
    • 1
    • 2
    • 3
    • 4
    1 1 1 1
    
    • 1

    2. S s(n);

    构造含有n个大小空间的实例s,每个元素都为默认构造函数T()构造的对象

    int main() {
        vector<int>vec1(4);
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
    }
    
    • 1
    • 2
    • 3
    • 4
    0 0 0 0
    
    • 1

    3. s(q1,q2);

    将[q1,q2)区间内的数据作为s的元素构造s

    int main() {
        int a[]={1,2,3,4};
        vector<int>vec1(a,a+4);
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1 2 3 4
    
    • 1
    int main() {
        list<int>l(4,2);
        vector<int>vec1(l.begin(),l.end());
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    2 2 2 2
    
    • 1

    请注意:下面这串代码就是上一篇博客所说的,这种初始化方法是不对的,它会报错

     vector<int>vec1(l.begin(),l.begin()+2);
    
    • 1

    赋值函数

    使用赋值函数时,将会把原有元素全都覆盖

    1. s.assign(n,t)

    赋值后的s由n个t元素组成,相当于把s用n个t初始化

    int main() {
        list<int>l(4,2);
        vector<int>vec1(l.begin(),l.end());
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
        vec1.assign(3,1);
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    2 2 2 2 
    1 1 1
    
    • 1
    • 2
    int main() {
        list<int>l(4,2);
        vector<int>vec1(l.begin(),l.end());
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
        vec1.assign(5,1);
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    2 2 2 2 
    1 1 1 1 1
    
    • 1
    • 2

    s.assign(n)
    赋值后的s由n个默认构造函数T()构造的元素组成
    这个赋值方法在验证时报错了,所以这里不推荐使用这个

    2. s.assign(q1,q2)

    赋值后的s的元素为[q1,q2)区间内的元素

    int main() {
        list<int>l(4,2);
        int a[]={1,2,3,4,5};
        deque<int>vec1(l.begin(),l.end());
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
        vec1.assign(a,a+5);
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2 2 2 2 
    1 2 3 4 5
    
    • 1
    • 2
    int main() {
        list<int>l(4,2);
        vector<int>vec={1,2,3,4,5};
        deque<int>vec1(l.begin(),l.end());
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
        vec1.assign(vec.begin(),vec.begin()+5);//此处assign可以使用vec.begin()+n,而在初始化时不可以
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2 2 2 2       
    1 2 3 4 5 
    
    • 1
    • 2

    元素插入

    可以一次插入一个或多个指定元素,也可以将一个迭代器区间所表示的序列插入,插入时需要一个指向s的迭代器表示插入位置。

    1. s.insert(p1,t)

    在p1位置前插入元素t,返回一个指向新元素的迭代器

    int main() {
        vector<int>vec1={1,2,3,4,5};
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
        cout<<*(vec1.insert(vec1.begin()+2,10))<<endl;//返回指向10的迭代器
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1 2 3 4 5 
    10
    1 2 10 3 4 5
    
    • 1
    • 2
    • 3

    2. s.insert(p1,n,t)

    在p1位置前插入n个元素t,无返回值,书上说无返回值,但实际上是有返回值的,且返回指向第一个新元素的迭代器。

    int main() {
        vector<int>vec1={1,2,3,4,5};
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
        vector<int>::iterator it=vec1.insert(vec1.begin()+2,2,10);
        cout<<*(it)<<endl;
        cout<<*(it+1)<<endl;
        cout<<*(it+2)<<endl;
        copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1 2 3 4 5 
    1 2 10 10 3 4 5
    
    • 1
    • 2

    3. s.insert(p1,q1,q2)

    在p1位置前插入[q1,q2)区间的元素

    4. s.emplace(p1,args)

    将参数args传递给T的构造函数构造新元素t,插在p1位置前,返回指向新元素的迭代器

    元素删除

    1. s1.erase(p1)

    删除s1中p1指向的元素,返回被删除的下一个元素的迭代器

    2. s1.erase(p1,p2)

    删除s1中[p1,p2)区间的元素,返回p2指向的元素的迭代器

    改变容器大小

    1. s.resize(n)

    将容器s大小改为n,若原容器s大小大于n,则末尾多余元素被删除,否则在容器末尾用T()填充

    首尾元素的直接访问

    1. s.front()

    获得首元素的引用

    2. s.back()

    获得尾元素的引用(不包括forward_list)

    在容器尾部插入、删除元素

    1. s.push_back(t)

    向尾部插入元素t

    2. s.emplace_back(args)

    将args传递给T的构造函数构造新元素t,向尾部插入新元素

    3. s.pop_back()

    将容器尾部的元素删除

    在容器头部插入、删除元素

    1. s.push_front(t)

    向头部插入于是元素t

    2. s.emplace_front(args)

    将参数args传递给T的构造函数构造新元素t,向头部插入新元素

    3. s.pop_front()

    删除容器头部的元素t

    容器列表初始化

    c++11支持顺序容器列表初始化,可以直接用列表的元素实例来创建一个新的顺序容器对象,并且隐式地将列表元素个数指定为新建容器大小(定长数组array需指定大小)

    如:

    list<int>numberSeq={1,4,7,9};//包含4个元素的列表容器对象
    vector<string>strs={"hello","world"};//包含2个string元素的向量容器对象
    
    • 1
    • 2
  • 相关阅读:
    Dubbo(二):Dubbo 2.x 基础配置 Xml 方式、注解方式 和 高级特性
    带你认识一下数仓的分区自动管理
    STP、RSTP、MSTP
    golang make和new的区别
    【读书笔记】《Head First设计模式(中文版)》【TBC】
    使用 Flask 和 WTForms 构建一个用户注册表单
    QT widget
    【LeetCode每日一题】【单调队列】2022-10-26 862. 和至少为K的最短子数组 Java实现
    【华为OD机试python】报文回路【2023 B卷|100分】
    在 Next.js 中实现用户授权
  • 原文地址:https://blog.csdn.net/weixin_45720193/article/details/127558850