各类容器基本概念介绍

本文详细介绍了C++STL中的各种容器,包括序列式容器如string、vector、deque、stack、queue、list,以及关联式容器如set、map。涵盖了它们的构造函数、赋值操作、容量大小管理、插入删除元素、数据存取以及交换排序等基本操作。同时,解释了栈和队列的原则,以及set和map的自动排序特性。

目录

序列式容器:

关联式容器:

1、构造函数

1.1 string容器

1.2 vector容器

1.3 deque容器

1.4 stack容器(栈)

1.5 queue容器(队列)

1.6 list容器(链表)

1.7 set容器(自动排序)

1.8 map容器(自动排序)

2、赋值操作

2.1 string容器

2.2 vector容器

2.3 deque容器

2.4 stack容器(栈)

2.5 queue容器(队列)

2.6 list容器(链表)

2.7 set容器(自动排序)

2.8 map容器(自动排序)

3、容量和大小操作

3.1 string容器

3.2 vector容器

3.3 deque容器

3.4 stack容器(栈)

3.5 queue容器(队列)

3.6 list容器(链表)

3.7 set容器(自动排序)

3.8 map容器(自动排序)

4、插入和删除操作

4.1 string容器

4.2 vector容器

4.3 deque容器

4.4 stack容器(栈)

4.5 queue容器(队列)

4.6 list容器(链表)

4.7 set容器(自动排序)

4.8 map容器(自动排序)

5、数据存取

5.1 string容器

5.2 vector容器

5.3 deque容器

5.4 stack容器(栈)

5.5 queue容器(队列)

5.6 list容器(链表)

5.7 set容器(自动排序)

5.8 map容器(自动排序)

6、交换和排序

6.1 string容器

6.2 vector容器

6.3 deque容器

6.4 stack容器(栈)

6.5 queue容器(队列)

6.6 list容器(链表)

6.7 set容器(自动排序)

6.8 map容器(自动排序)

7、其余操作

7.1 string容器

7.2 vector容器

7.3 deque容器

7.4 stack容器(栈)

7.5 queue容器(队列)

7.6 list容器(链表)

7.7 set容器(自动排序)

7.8 map容器(自动排序)


序列式容器:

Array:固定大小,初始多少就是多少

Vector:单端数组,容器不够会自动增长,内存的分配器做这个事情,动态扩展并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间

Deque:双端数组,两头都可以添加,本质是由中控器缓冲区组成,中控器记录缓冲区地址,缓冲区中存放真实的数据,使得看起来是一片连续的内存空间

List:双向链表、单向链表

stack容器:stack容器是栈,原则:先进后出,栈中只有顶端的元素可以被外界使用,因此不允许有遍历的行为

queue容器:queue容器是队列,原则:先进先出,队列容器允许从一端新增元素,从另一端移除元素。队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为

关联式容器:

底层由红黑树:高度平衡二叉树

set容器中的所有元素都会在插入时被自动排序,它属于关联式容器,底层结构是用二叉树实现。set和multiset区别:1、set不允许容器中有重复的元素 2、multiset允许容器中有重复的元素

map容器中所有元素都是pair,pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值),所有元素都会根据元素的键值自动排序。它也属于关联式容器,底层结构是用二叉树实现。可以根据key值快速找到value值。map和multimap区别:1、map不允许容器中有重复key值元素 2、multimap允许容器中有重复key值元素

set key和val是一个值,map key和val不同,set的元素不能重复,map的key不能重复。Multimap表示可重复。

Unordered Set:不定序

哈希碰撞: 拉链法

1、构造函数

1.1 string容器

  • string();           //创建一个空的字符串 例如: string str;
    string(const char* s);        //使用字符串s初始化
  • string(const string& str);    //使用一个string对象初始化另一个string对象
  • string(int n, char c);           //使用n个字符c初始化

1.2 vector容器

  • vector<T> v;                   //采用模板实现类实现,默认构造函数
  • vector(v.begin(), v.end());       //将v[begin(), end())区间中的元素拷贝给本身。
  • vector(n, elem);                            //构造函数将n个elem拷贝给本身。
  • vector(const vector &vec);         //拷贝构造函数。
         

1.3 deque容器

  • deque<T> deqT;                      //默认构造形式
  • deque(beg, end);                  //构造函数将[beg, end)区间中的元素拷贝给本身。
  • deque(n, elem);                    //构造函数将n个elem拷贝给本身。
  • deque(const deque &deq);   //拷贝构造函数


1.4 stack容器(栈)

  • stack<T> stk;                                 //stack采用模板类实现, stack对象的默认构造形式
  • stack(const stack &stk);            //拷贝构造函数


1.5 queue容器(队列)

  • queue<T> que;                                 //queue采用模板类实现,queue对象的默认构造形式
  • queue(const queue &que);            //拷贝构造函数


1.6 list容器(链表)

  • list<T> lst;                               //list采用采用模板类实现,对象的默认构造形式:
  • list(beg,end);                           //构造函数将[beg, end)区间中的元素拷贝给本身。
  • list(n,elem);                             //构造函数将n个elem拷贝给本身。
  • list(const list &lst);            //拷贝构造函数。

1.7 set容器(自动排序)

multiset允许容器有重复的元素

  • set<T> st;                        //默认构造函数:
  • set(const set &st);       //拷贝构造函数

1.8 map容器(自动排序)

所有元素都是pair,first元素为key,second元素为value

multimap允许容器有重复的key

  • map<T1, T2> mp;                     //map默认构造函数:
  • map(const map &mp);             //拷贝构造函数

2、赋值操作

2.1 string容器

  • string& operator=(const char* s);             //char*类型字符串 赋值给当前的字符串
  • string& operator=(const string &s);         //把字符串s赋给当前的字符串
  • string& operator=(char c);                          //字符赋值给当前的字符串
  • string& assign(const char *s);                  //把字符串s赋给当前的字符串
  • string& assign(const char *s, int n);     //把字符串s的前n个字符赋给当前的字符串
  • string& assign(const string &s);              //把字符串s赋给当前字符串
  • string& assign(int n, char c);                  //用n个字符c赋给当前字符串

2.2 vector容器

  • vector& operator=(const vector &vec);//重载等号操作符
  • assign(beg, end);       //将[beg, end)区间中的数据拷贝赋值给本身。
  • assign(n, elem);        //将n个elem拷贝赋值给本身。

     


2.3 deque容器

  • deque& operator=(const deque &deq);         //重载等号操作符
  • assign(beg, end);                                           //将[beg, end)区间中的数据拷贝赋值给本身
  • assign(n, elem);                                             //将n个elem拷贝赋值给本身。

2.4 stack容器(栈)

  • stack& operator=(const stack &stk);           //重载等号操作符

2.5 queue容器(队列)

  • queue& operator=(const queue &que);           //重载等号操作符

2.6 list容器(链表)

  • assign(beg, end);            //将[beg, end)区间中的数据拷贝赋值给本身。
  • assign(n, elem);              //将n个elem拷贝赋值给本身。
  • list& operator=(const list &lst);         //重载等号操作符

2.7 set容器(自动排序)

multiset允许容器有重复的元素

  • set& operator=(const set &st);    //重载等号操作符

2.8 map容器(自动排序)

所有元素都是pair,first元素为key,second元素为value

multimap允许容器有重复的key

  • map& operator=(const map &mp);    //重载等号操作符

3、容量和大小操作

3.1 string容器


3.2 vector容器

  • empty(); //判断容器是否为空

  • capacity(); //容器的容量

    [容量]  与deque和list容器不同,这是vector独有的

  • size(); //返回容器中元素的个数

  • resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除。

  • resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除


3.3 deque容器

  • deque.empty(); //判断容器是否为空

  • deque.size(); //返回容器中元素的个数

  • deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除。

  • deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除。

3.4 stack容器(栈)

  • empty(); //判断堆栈是否为空

  • size(); //返回栈的大小

3.5 queue容器(队列)

  • empty(); //判断堆栈是否为空

  • size(); //返回栈的大小

3.6 list容器(链表)

  • size(); //返回容器中元素的个数

  • empty(); //判断容器是否为空

  • resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除。

  • resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除。

3.7 set容器(自动排序)

multiset允许容器有重复的元素

  • size(); //返回容器中元素的数目

  • empty(); //判断容器是否为空

3.8 map容器(自动排序)

所有元素都是pair,first元素为key,second元素为value

multimap允许容器有重复的key

  • size(); //返回容器中元素的数目

  • empty(); //判断容器是否为空



4、插入和删除操作

4.1 string容器

  • string& insert(int pos, const char* s); //插入字符串

  • string& insert(int pos, const string& str); //插入字符串

  • string& insert(int pos, int n, char c); //在指定位置插入n个字符c

  • string& erase(int pos, int n = npos); //删除从Pos开始的n个字符


[容器]  从下方开始,括号内输入的是:迭代器

4.2 vector容器

  • push_back(ele); //尾部插入元素ele

  • pop_back(); //删除最后一个元素

  • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele

  • insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele

  • erase(const_iterator pos); //删除迭代器指向的元素

  • erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素

  • clear();


4.3 deque容器

两端插入操作:

  • push_back(elem); //在容器尾部添加一个数据

  • push_front(elem); //在容器头部插入一个数据

  • pop_back(); //删除容器最后一个数据

  • pop_front(); //删除容器第一个数据

指定位置操作:

  • insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。

  • insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。

  • insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。

  • clear(); //清空容器的所有数据

  • erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。

  • erase(pos); //删除pos位置的数据,返回下一个数据的位置。

4.4 stack容器(栈)

  • push(elem); //向栈顶添加元素

4.5 queue容器(队列)

  • push(elem); //往队尾添加元素

4.6 list容器(链表)

  • push_back(elem);//在容器尾部加入一个元素

  • pop_back();//删除容器中最后一个元素

  • push_front(elem);//在容器开头插入一个元素

  • pop_front();//从容器开头移除第一个元素

  • insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。

  • insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。

  • insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。

  • clear();//移除容器的所有数据

  • erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。

  • erase(pos);//删除pos位置的数据,返回下一个数据的位置。

  • remove(elem);//删除容器中所有与elem值匹配的元素。

    [remove]  这是与deque容器不同的地方

4.7 set容器(自动排序)

multiset允许容器有重复的元素

  • insert(elem); //在容器中插入元素。

  • clear(); //清除所有元素

  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。

  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。

  • erase(elem); //删除容器中值为elem的元素。

4.8 map容器(自动排序)

所有元素都是pair,first元素为key,second元素为value

multimap允许容器有重复的key

  • insert(elem); //在容器中插入元素。

  • clear(); //清除所有元素

  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。

  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。

  • erase(key); //删除容器中值为key的元素。

    [注意]  set与map容器删除指定元素的不同:set是删除值为elem的元素,而map是删除key为elem的元素

<!--与set容器一样,二者的插入只有insert-->

四种插入方式:

map<int, int> m;
    //第一种插入方式
    m.insert(pair<int, int>(1, 10));
    
    //第二种插入方式(***)
    m.insert(make_pair(2,20));
​
    //第三种插入方式(太长,不建议使用)
    m.insert(map<int, int>::value_type(3, 30));
​
    //第四种插入方式(不建议使用)
    m[4] = 40;
    //cout << m[5] << endl;         //使用第四种方式,使得有 m[5]=0 ,但实际并不需要


5、数据存取

5.1 string容器

  • char& operator[](int n); //通过[]方式取字符

  • char& at(int n); //通过at方法获取字符


5.2 vector容器

  • at(int idx); //返回索引idx所指的数据

  • operator[]; //返回索引idx所指的数据

  • front(); //返回容器中第一个数据元素

  • back(); //返回容器中最后一个数据元素


5.3 deque容器

  • at(int idx); //返回索引idx所指的数据

  • operator[]; //返回索引idx所指的数据

  • front(); //返回容器中第一个数据元素

  • back(); //返回容器中最后一个数据元素

    <!--下面的容器就没有[]访问或at()访问每个字符的-->


5.4 stack容器(栈)

  • push(elem); //向栈顶添加元素

  • pop(); //从栈顶移除第一个元素

  • top(); //返回栈顶元素

5.5 queue容器(队列)

  • push(elem); //往队尾添加元素

  • pop(); //从队头移除第一个元素

  • back(); //返回最后一个元素

  • front(); //返回第一个元素

5.6 list容器(链表)

  • front(); //返回第一个元素。

  • back(); //返回最后一个元素。

5.7 set容器(自动排序)

multiset允许容器有重复的元素

5.8 map容器(自动排序)

所有元素都是pair,first元素为key,second元素为value

multimap允许容器有重复的key



6、交换和排序

6.1 string容器


6.2 vector容器

  • swap(vec); // 将vec与本身的元素互换


6.3 deque容器

  • sort(iterator beg, iterator end) //对beg和end区间内元素进行排序


6.4 stack容器(栈)

6.5 queue容器(队列)

6.6 list容器(链表)

  • reverse(); //反转链表

  • sort(); //链表排序

    <!--sort类型默认升序操作,要实现降序,需定义bool类型的全局函数,并放入sort函数中-->

6.7 set容器(自动排序)

multiset允许容器有重复的元素

  • swap(st); //交换两个集合容器

  • 利用仿函数,可以改变排序规则

  • 默认升序;降序:在class类函数内定义仿函数,并导入set初始化类型中

6.8 map容器(自动排序)

所有元素都是pair,first元素为key,second元素为value

multimap允许容器有重复的key

  • swap(st); //交换两个集合容器

  • 利用仿函数,可以改变排序规则

  • 默认升序;降序:在class类函数内定义仿函数,并导入map初始化类型中



7、其余操作

7.1 string容器

字符串拼接

  • string& operator+=(const char* str); //重载+=操作符

  • string& operator+=(const char c); //重载+=操作符

  • string& operator+=(const string& str); //重载+=操作符

  • string& append(const char *s); //把字符串s连接到当前字符串结尾

  • string& append(const char *s, int n); //把字符串s的前n个字符连接到当前字符串结尾

  • string& append(const string &s); //同operator+=(const string& str)

  • string& append(const string &s, int pos, int n);//字符串s中从pos开始的n个字符连接到字符串结尾

查找和替换

  • int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找

  • int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置

  • int find(const char c, int pos = 0) const; //查找字符c第一次出现位置

  • int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找

  • int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找

  • int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置

  • int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置

  • string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str

  • string& replace(int pos, int n,const char* s); //替换从pos开始的n个字符为字符串s

    <!--find:从左往右找 rfind:从右往左找-->

    <!--find返回的是第一个字符的位置,若查找不到则返回-1-->

字符串比较

  • int compare(const string &s) const; //与字符串s比较

  • int compare(const char *s) const; //与字符串s比较

  • 比较方式:

  • 字符串比较是按字符的ASCII码进行对比

    = 返回 0

    > 返回 1

    < 返回 -1

字符串子串

string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串


7.2 vector容器

预留空间—减小vector在动态扩展容量时的扩展次数

  • reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。


7.3 deque容器


7.4 stack容器(栈)

7.5 queue容器(队列)

7.6 list容器(链表)

  • reverse(); //反转链表

  • sort(); //链表排序

    <!--sort类型默认升序操作,要实现降序,需定义bool类型的全局函数,并放入sort函数中-->

7.7 set容器(自动排序)

multiset允许容器有重复的元素

查找和统计

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();

  • count(key); //统计key的元素个数

set和multiset区别

  • set不可以插入重复数据,而multiset可以

  • set插入数据的同时会返回插入结果,表示插入是否成功,返回的是 pair<set<int>::iterator, bool> 类型

    <!--插入成功:bool返回1,插入失败:bool返回0-->

  • multiset不会检测数据,因此可以插入重复数据

pair对组创建

两种创建方式:

  • pair<type, type> p ( value1, value2 );

  • pair<type, type> p = make_pair( value1, value2 );

7.8 map容器(自动排序)

所有元素都是pair,first元素为key,second元素为value

multimap允许容器有重复的key

  • 查找和统计

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();

  • count(key); //统计key的元素个数

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值