C++容器

顺序容器:此处的顺序不是体现在元素的值的顺序,而是指的是元素加入容器时的位置顺序相对应的。
关联容器:关联容器中的元素是按照关键字来保存和访问的。也就是通过键去获得对应的值
迭代器范围:一个迭代器范围由一对迭代器表示,两个迭代器分别指向同一个容器中的首元素或者尾元素之后的位置。这两个迭代器分别叫做begin和end,它们标记了容器中元素的一个范围[begin,end)。


顺序容器

顺序容器类型 特点
vector 可变大小数组 支持快速随机访问。因为元素保存在连续的内存空间里 中间位置添加删除元素很慢。在尾部插入删除速度快。因为要移动插入/删除位置之后的所有元素
string 专用于保存字符(与vector相似) 支持随机访问 中间位置添加删除元素很慢。在尾部插入删除速度快
deque 双端队列 支持快速随机访问 头尾位置插入/删除速度很快
list 双向链表 不支持随机访问。只支持双向顺序访问 在链表的任何位置插入和删除都很快
forward_list 单向链表 不支持随机访问。只支持单向顺序访问 在链表的任何位置插入和删除都很快
array 固定大小数组 支持快速随机访问 不能添加或删除元素


顺序容器类型别名 作用
iterator 此容器类型的迭代器类型
const_iterator 可以读取元素,但不能修改元素的迭代器类型
size_type 无符号整数类型,足够保存此容器类型最大可能容器的大小
defference_type 带符号整数类型,足够保存两个迭代器之间的距离
value_type 元素类型
reference 元素的左值类型,与value_type&含义相同
const_reference 元素的const左值类型,即const value_type&




构造函数 作用
C c 默认构造函数,构造空容器
C c1(c2) 构造c2的拷贝c1
C c(b,e) 构造c,将迭代器b和e指定的范围内的元素拷贝到c(array不支持)
C c{a,b,c…} 列表初始化c

(1)以vector来举个例子:

#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector<int> vec1;               //默认初始化,vec1为空 
    for(int i = 1;i <= 10;i++){
        vec1.push_back(i);
    } 

    vector<int> vec2(vec1);         //使用vec1初始化vec2
    vector<int> vec3(vec1.begin(),vec1.end());
    vector<int> vec4(10);           //10个值为0的元素 
    vector<int> vec5(10,4);         //10个值为4的元素 

    cout << (vec1 == vec2) ? true : false;
    cout << "\n";
    cout << (vec1 == vec3) ? true : false;
    return 0;
}

控制台输出:
这里写图片描述

(2)以list来举个例子

#include <iostream>
#include <list>
using namespace std;
int main(){
    list<int> list1;                //创建一个空的list 
    list<int> list2(list1);         //使用list1初始化list2 
    list<int> list3(3);             //创建含有3个元素的list3 
    list<int> list4(10,5);          //创建10个元素为5的list4 
    list<int> list5(list1.begin(),list1.end()); //使用list1初始化list5,同list2 

    cout << ((list1 == list2) ? true : false) << endl; 
    return 0;
}
控制台输出:1

(3)特殊的array,具有固定大小。在定义array时,不仅要指定元素类型,还需要指定容器大小。

#include <iostream>
#include <array>
using namespace std;

int main(){
    array<int,10> a1;                           //10个默认初始化的int
    array<int,10> a2 = {0,1,2,3,4,5,6,7,8,9};   //列表初始化
    array<int,10> a3 = {42};                    //a3[0]是42,剩余元素为0 

    //a4 = {0};                                 //错误:不能将一个花括号列表赋予数组 
    return 0;
}



赋值与swap 作用
c1 = c2 将c1中的元素替换为c2中的元素
c1 = {a,b,c…} 将c1中的元素替换为列表中的元素,不适用于array
a.swap(b) 交换a和b的元素
swap(a,b) 与a.swap(b)等价


大小 作用
c.size() c中元素的数目,不支持forward_list
c.max_size() c可保存在最大元素数目
c.empty() 判断c中是否含有元素,有元素返回false,否则返回true


添加删除元素(不适用array) 作用
c.insert(args) 将args中的元素拷贝进c
c.emplace(inits) 适用inits构造c中的一个元素
c.erase(args) 删除args指定的元素
c.clear(args) 删除c中的所有元素,返回void

(1)vector容器

#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector<int> vec1;               //默认初始化,vec1为空 
    vec1.push_back(1);              //从末尾插入一个元素             vector中元素:1 
    vec1.insert(vec1.end(),2,3);    //从vec1.end()位置插入2个3        vector中元素:1 3 3
    vec1.insert(vec1.begin(),2,4);  //从vec1.begin()位置插入2个4      vector中元素:4 4 1 3 3

    vec1.pop_back();                            //删除末尾元素        vector中元素:4 4 1 3 
    vec1.erase(vec1.begin(),vec1.begin()+2);    //删除vec1[0]-vec1[2]之间的元素,不包括vec1[2]

    int size = vec1.size();         //得到vector的大小 
    bool isEmpty = vec1.empty();    //判断vector是否为空  

    //使用迭代器遍历 
    vector<int>::iterator iter = vec1.begin(); 
    for(;iter != vec1.end();iter++){
        cout << *iter << " ";
    }           
    return 0;
}

(2)list容器
list中的erase的作用是,使作为参数的迭代器失效,并返回指向该迭代器的下一个参数的迭代器

#include <iostream>
#include <list>
using namespace std;

int main(){
    list<int> list1;                //创建一个空的list 
    list<int> list2(3);             //创建含有3个元素的list 

    list1.assign(list2.begin(),list2.end());    //分配值,3个值为0的元素      0 0 0
    list1.push_back(10);                        //末尾添加一个值               0 0 0 10
    list1.insert(list1.begin(),3,2);            //从指定位置插入3个值为2的元素  2 2 2 0 0 0 10
    list1.erase(list1.begin());                 //使指定位置的迭代器失效        2 2 0 0 0 10 

    list1.assign(list2.begin(),list2.end());    //分配值,会覆盖之前的所有值     0 0 0

    list1.pop_back();                           //删除末尾的值                    0 0  
    list1.clear();                              //清空list1的全部值
    list1.erase(list1.begin(),list1.end());     //删除元素 

    list1.front();      //返回第一个元素的引用
    list1.back();       //返回最后一个元素的引用
    list1.size();
    list1.sort();
    list1.unique();

    return 0;
}


反向容器的额外成员(不支持forward_list) 作用
reverse_iterator 按逆序寻址元素的迭代器
const_reverse_iterator 不能修改元素的逆序迭代器
c.rbegin(),c.rend() 返回指向c的尾元素和首元素之前位置的迭代器
c.crbegin(),c.crend() 返回const_reverse-iterator



(1)每个顺序容器都有一个front成员函数,返回首元素的引用。
(2)除了forward_list,其他的所有顺序容器都有一个back成员函数,返回尾元素的引用。
(3)forward_list不支持递减迭代器,即–操作
(4)at(n) 成员函数,返回下标为n的元素的引用。如果下标越界,则抛出out_of_range异常,只适用于string、vector、deque和array

获取迭代器 作用
c.begin(),c.end() 返回指向c的首元素和尾元素之后位置的迭代器
c.cbegin(),c.cend() 返回const_iterator


关系运算符 作用
==,!= 相等不等运算符
<,<=,>,>= 关系运算符(无序关联容器不支持)

猜你喜欢

转载自blog.csdn.net/qq_36748278/article/details/79941492