zoukankan      html  css  js  c++  java
  • 序列容器和容器适配器

    序列容器

    array<T,N> vector List
    deque foward_list

    常用函数接口 array,deque,vector。

    函数成员 函数功能 array<T,N> vector deque
    begin() 返回指向容器中第一个元素的迭代器。
    end() 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
    operator=() 复制同类型容器的元素,或者用初始化列表替换现有内容。
    size() 返回实际元素个数。
    capacity() 返回当前容量。 - -
    empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
    front() 返回第一个元素的引用。
    back() 返回最后一个元素的引用。
    operator 使用索引访问元素。
    at() 使用经过边界检査的索引访问元素。
    push_back() 在序列的尾部添加一个元素。 -
    insert() 在指定的位置插入一个或多个元素。 -
    pop_back() 移出序列尾部的元素。 -
    erase() 移出一个元素或一段元素。 -
    clear() 移出所有的元素,容器大小变为 0。 -
    swap() 交换两个容器的所有元素。
    data() 返回指向容器中第一个元素的[指针] -

    List和foward_list

    list 和 forward_list 容器彼此非常相似,forward_list 中包含了 list 的大部分成员函数,而未包含那些需要反向遍历的函数

    函数成员 函数功能 list forward_list
    begin() 返回指向容器中第一个元素的迭代器。
    end() 返回指向容器最后一个元素所在位置后一个位置的迭代器。
    rbegin() 返回指向最后一个元素的迭代器。 -
    rend() 返回指向第一个元素所在位置前一个位置的迭代器。 -
    assign() 用新元素替换原有内容。
    operator=() 复制同类型容器的元素,或者用初始化列表替换现有内容。
    size() 返回实际元素个数。 -
    empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
    front() 返回容器中第一个元素的引用。
    back() 返回容器中最后一个元素的引用。 -
    push_back() 在序列的尾部添加一个元素。 -
    push_front() 在序列的起始位置添加一个元素。
    insert() 在指定的位置插入一个或多个元素。 -
    insert_after() 在指定位置的后面插入一个或多个元素。 -
    pop_back() 移除序列尾部的元素。 -
    pop_front() 移除序列头部的元素。
    reverse() 反转容器中某一段的元素。
    erase() 移除指定位置的一个元素或一段元素。 -
    erase_after() 移除指定位置后面的一个元素或一段元素。 -
    remove() 移除所有和参数匹配的元素。
    remove_if() 移除满足一元函数条件的所有元素。
    unique() 移除所有连续重复的元素。
    clear() 移除所有的元素,容器大小变为 0。
    sort() 对元素进行排序。
    merge() 合并两个有序容器。
    splice() 移动指定位置前面的所有元素到另一个同类型的 list 中。 -
    splice_after() 移动指定位置后面的所有元素到另一个同类型的 list 中。 -

    数组

    声明和初始化

    #include<array>
    
    std::array<double, 10> data {};//默认初始化为0
    std::array<souble, 10>data {1,2,3};//前三个元素初始化为对应值,其余为0
    data.fill(1)//所有元素初始化为对应值
    

    容器数组作为参数传递时,可以不用传递大小,二通过size()函数获取

    double sum {};
    for(size_t i{0};i<data.size();++i)
    {
    	sum+=data[i];
    }
    

    Vector

    创建和初始化

    //声明
    #include<string>
    #include<vector>
    uisng namespace std;
    
    vector<string> data;//没有分配内存空间
    //这是一个好习惯,声明时先指定一个大小,避免重复分配内存,此时初始化为0
    vector<string> data(20);
    声明时先指定一个大小,避免重复分配内存,此时初始化为val
    vector<string> data(20,val);
    
    vector<string> words {"one", "two","three", "four", "five"};
    
    //迭代器来初始化
    std::array<std :: string, 5> words {"one", "two","three", "four", "five"};
    std::vector<std::string> words_copy {std::begin(words) , std::end(words)};
    

    末尾插入元素对比

    emplace_back()和push_back()

    emplace_back()是c11引入的新特性,避免了临时对象的创建和销毁,浪费资源。//emplace_back() 的参数正是添加到容器中的对象的构造函数所需要的参数,故而能直接在容器中创建对象,而push_back需要先创建临时对象,再移动到容器中,如果对象类没有右值拷贝构造和右值移动赋值函数,将会增加临时对象的创建和销毁的资源浪费

    参卡: https://blog.csdn.net/xiaolewennofollow/article/details/52559364

    举例:

    std::vector<std::string> words;
    words.push_back (std:: string ("facetious") ) ; // Calls string constructor & moves the string object
    words•emplace_back("abstemious");// Calls string constructor to create element in place
    

    emplace()和insert()

    区别同上一对的关系,emplace()是c11引入的新特性。

    auto iter = words.emplace(++std::begin(words),5,'A');//指定位置插入五个A
    auto iter = words.insert(++std::begin(words), "two");//指定位置插入TWO,位置使用迭代器。
    

    insert还有很多种用法。

    删除元素

    clear()

    删除所有元素,并初始化空间为0

    删除元素只会改变size不会改变capacity

    vector<int> a(100, 90);
    a.clear();
    cout << a.size() << endl;
    cout << a.capacity() << endl;
    
    out:
    0
    100
    

    pop_back()

    删除末尾元素

    删除元素只会改变size不会改变capacity

    data.pop_back()
    

    如果不考虑顺序,如下步骤可以删除指定位置的元素

    #include<algorithm>
    std::swap(std::begin(data)+1,std::end(data)-1);//交换指定位置(第二个)的元素和最后一个元素
    data.pop_back()
    

    模板函数 swap(),它在头文件 algorithm 和 utility 中都有定义。这个函数将第二个元素和最后一个元素互相交换,区分vector成员函数swap是交换两个人相同类型容器。

    shrink_to_fit()

    去掉容器中多余的容量

    删除元素不仅改变size,还会改变capacity

    vector<int> data(10,1);
    data.pop_back();
    data.shrink_to_fit();
    cout << data.size() << endl;
    cout << data.capacity() << endl;
    
    out:
    9
    9
    

    erase()

    1 删除指定位置的元素

    只改变size,不改变capability;

    auto iter = data.erase(std::begin(data)+1); //Delete the second element
    

    2 删除指定范围的元素

    左闭右开

    // Delete the 2nd and 3rd elements
    auto iter = data.erase(std::begin(data)+1,std::begin(data)+3);//删除2,3,
    

    返回值iter,如果删除最后一个元素,iter== std::end(data) ,否则指向删除元素之后的下一个位置

    begin end
    1 2 3 4 5

    删除2和3,之后

    begin iter end
    1 4 5

    栈stack

    创建和初始化

    //创建
    std::stack<std::string> words;
    初始化,不能直接通过{}来初始化,
    //stack<double>s{1.3,3.0,4.1}
    初始化1
    //容器初始化,第二个参数指明底层使用序列容器,默认是deque
    std::list<double>values{1.414,3.14,2.7};
    std::stack<std::double,std::list<double>>my_stack(values);
    //一个栈拷贝初始化另一个
    std::stack<double>copy_stack{my_stack};
    

    常用接口

    top():返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。
    push(const T& obj):可以将对象副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
    push(T&& obj):以移动对象的方式将对象压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。
    pop():弹出栈顶元素。
    size():返回栈中元素的个数。
    empty():在栈中没有元素的情况下返回 true。
    emplace():用传入的参数调用构造函数,在栈顶生成对象。
    swap(stack<T> & other_stack):将当前栈中的元素和参数中的元素交换。参数所包含元素的类型必须和当前栈的相同。对于 stack 对象有一个特例化的全局函数 swap() 可以使用。
    

    队列

    创建和初始化:和栈是一样的

    std::queue<std::string>words;
    std::queue<std::string>copy_words(words);
    stack<T>、queue<T> 这类适配器类都默认封装了一个 deque<T> 容器,也可以通过指定第二个模板类型参数来使用其他类型的容器:
    std::stack<std::double,std::list<double>>my_stack(values);
    

    常用接口

    front()//返回第一个元素的引用,如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
    back()//返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
    push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数push_back() 来完成的。
    push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
    pop()//删除 queue 中的第一个元素。
    size()//返回 queue 中元素的个数。
    empty()//如果 queue 中没有元素的话,返回 true。
    emplace()//:用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
    swap(queque<T>&other_q)//将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。
    

    stack和queue元素访问方式

    stack和queque没有迭代器,只能通过遍历容器,访问一个,弹出一个

    deque<int>values{1,2,3,4,5};
    queue<int>q(values);
    
    while(!q.empty())
    {
    	cout<<q.front()<<" ";
    	q.pop();
    }
    cout<<endl;
    

    优先队列

    priority_queue 容器适配器定义了一个元素有序排列的队列。默认队列头部的元素优先级最高

    priority_queue 模板有 3 个参数,其中两个有默认的参数;第一个参数是存储对象的类型,第二个参数是存储元素的底层容器,默认是vector,第三个参数是函数对象,它定义了一个用来决定元素顺序的断言,默认是less,即最大元素排在前面,因此模板类型是:

    template <typename T, typename Container=std::vector<T>, typename Compare=std::less<T>> class priority_queue
    

    当然: greater,用来作为模板的最后一个参数对元素排序,最小元素会排在队列前面。当然,如果指定模板的最巵一个参数,就必须提供另外的两个模板类型参数。

    实例如下:

    #include<queue>
    priority_queue<int, vector<int>, greater<int>> pque;
    

    常用接口

    push(const T& obj):将obj的副本放到容器的适当位置,这通常会包含一个排序操作。
    push(T&& obj):将obj放到容器的适当位置,这通常会包含一个排序操作。
    emplace(T constructor a rgs...):通过调用传入参数的构造函数,在序列的适当位置构造一个T对象。为了维持优先顺序,通常需要一个排序操作。
    top():返回优先级队列中第一个元素的引用。
    pop():移除第一个元素。
    size():返回队列中元素的个数。
    empty():如果队列为空的话,返回true。
    swap(priority_queue<T>& other):和参数的元素进行交换,所包含对象的类型必须相同。
    
  • 相关阅读:
    linux下Tomcat配置提示权限不够解决办法
    Linux 生成SSL证书 供 nginx使用
    mysql存储emoji表情报错的处理方法【更改编码为utf8mb4】
    Linux Mysql 备份与还原
    Linux 安装Mysql
    Linux 卸载Mysql
    Linux yum安装java环境
    InMemoryUploadedFile对象复制到磁盘中的临时路径
    在django中使用(配置)celery
    使用ffmpeg以mp4的格式保存视频
  • 原文地址:https://www.cnblogs.com/Alexkk/p/12655928.html
Copyright © 2011-2022 走看看