iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现STL容器的示例
  • 941
分享到

C++实现STL容器的示例

2024-04-02 19:04:59 941人浏览 八月长安
摘要

各大容器的特点: 1.可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map; 特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法

各大容器的特点:

1.可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map;

特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法插入元素的!

2. 序列式容器才可以在容器初始化的时候制定大小,关联式容器不行;

3.注意,关联容器的迭代器不支持it+n操作,仅支持it++操作。

适配器的概念

适配器的意思就是将某些已经存在的东西进行限制或者组合变成一个新的东西,这个新的东西体现一些新的特性,但底层都是由一些已经存在的东西实现的。

STL中的容器

vector :矢量(并非数学意义上的) STL最简单的序列类型,也是一些适配器的默认底层类

deque:双端队列可从头尾出队入队

list:双向链表

forwardd_list:单向链表,功能少一些,不可反转。

queue:队列,一个适配器类(底层模板类默认deque),不允许随机访问和历遍;展示队列的接口

priority_queue:优先队列,一个适配器类(底层模板类默认vector),默认大根堆(最大的元素在最前面)。

stack:栈,一个适配器类(底层模板类默认vector),给底层类提供典型的栈接口。

特别的

array:并非STL容器,长度固定,但也能使用一些STL算法

容器基本都有以下几种功能,具体情况视容器而定

p,q,i,j表示迭代器

序列基本要求,拿vector举例,p , q , i , j 表示迭代器

vector <int> vec (n,t); //创建并初始化
vector <int> (n,t);     //创建匿名对象并初始化
vector <int> vec (i,j); //创建并初始化为另一个容器[i,j)内容
vector <int>  (i,j);    //创建匿名对象并初始化为另一个容器[i,j)内容
vec.insert(p,t);        //插入t到p的前面
vec.insert(p,n,t);      //插入n个t到p的前面
vec.insert(p,i,j);      //将区间[i,j)插入到p的前面(可以为自己的区间后者其他容器的区间)
vec.erase(p);           //删除p指向的元素
vec.erase(p,q);         //删除[p,q)区间的元素
vec.clear();            //清空容器,等价于vec.erase(vec.begin(),vec.end());

一些可选要求,见名知义了,不解释。

.front();
.back();
.push_front();
.push_back();
.pop_front();
.pop_back();
 
[n]
.at(n);

.at()和 [ ]很像,不过前者在越界是会引发一个异常,我们可以进行捕获

deque 

用双端队列演示上面的一些

#include <iOStream>
#include <deque>
#include <alGorithm>
using namespace std;
void show(int & t)
{
    cout << t << " ";
}
int main()
{
    deque<int> a(10,5);
    a.push_front(10);
    a.push_back(20);
    for_each(a.begin(),a.end(),show);
    cout << endl;
    a.pop_front();
    a.pop_back();
    for_each(a.begin(),a.end(),show);
    a.push_back(999);
    cout << endl << a.at(10) << " " << a[10];
    try{
        cout << endl << a.at(100);
    }
    catch (out_of_range){
        cout << "越界访问";
    }
    return 0;
}

 运行结果

queue

一些queue的方法

priority_queue

可以用其进行堆排序

int main()
{
    srand((unsigned)time(NULL));
    priority_queue<int> pq;
    for(int i=0;i<100;i++){
        int x = rand() %1000+1;
        pq.push(x);
    }
    for(int i=0;i<100;i++){
        cout << pq.top() << " ";
        if(i%10 == 0)
            cout << endl;
        pq.pop();
    }
    return 0;
}

 运行结果

时间复杂度O(nlogn),因为是基于树形结构,每次pop时间复杂度O(logn),进行n次。

一些方法

list

list的一些基本成员函数

void merge(list<T, Alloc> & X)

链表x与调用链表合并,在合并之前必须进行排序。合并后的链表存储在调用链表中,x变为空链表。线性时间复杂度

void remove(const T &val)

删除表中的所有val,线性时间复杂读。

void sort()

因为 list 不支持随机访问,不能使用 std::sort(),但是可以使用自带的 sotr,时间复杂度    O(nlogn)

void (iterator pos, list <T, Alloc> x)

将x链表插入到pos的前面,x变为空。固定时间复杂度。

void unique() 将连续的相同元素压缩为单个元素。线性时间复杂度

 示例

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
void show(int & t)
{
    cout << t << " ";
}
 
ostream & operator<<(ostream & os, list<int> & s)
{
    for_each(s.begin(),s.end(),show);
    return os;
}
int main()
{
    list <int> one (5,2);
    list <int> two (5,3);
    list <int> three;
    int num[5] = {1,6,3,5,2};
    three.insert(three.begin(),num,num+5);
    cout << "list one is " << one << endl;
    cout << "list two is " << two << endl;
    cout << "list three is(use insert) " << three << endl;
    three.sort();
    cout << "list three use sort " << three << endl;
    three.merge(two);
    cout << "list three use merge to list two \n" << "now list two is empty: ";
    cout << "list two is " << two << endl;
    cout << "now list three is " << three << endl;
    three.splice(three.begin(),one);
    cout << "three use splice to one \n" << "now list one is empty: ";
    cout << "now list one is " << one << endl;
    cout << "now list three is " << three << endl;
    three.unique();
    cout << "three use unique is " << three << endl;
    three.sort();
    cout << "list three use sort and unique: " << three << endl;
    three.remove(3);
    cout << "now use remove delete 3: " << three;
    return 0;
}

运行结果

 注意merge(),不是简单的拼接,是有顺序的合并。而spille()才是拼接(插入)。

forwarrd_list

一些方法 

stack

一些方法

关联容器

关联容器是队容器概念的另一个改进,关联容器将数据和关键字(key)存放在一起,用关键字来快速的查找数据。
STL提供了四种关联容器,set, multiset, map, multimap。

set(关联集合)

可翻转,可排序,并且存储进去的时候自动排好序。关键字唯一即一个数据有且只有一个关键字并且与存储类型相同。

#include <iostream>
#include <algorithm>
#include <set>
#include <iterator>
using namespace std;
 
int main()
{
    const int n =6;
    string str[n] = {"hello", "world", "i am", "set use","c++","uNIOn"};
    //构造函数接受两个迭代器表示区间,初始化为区间内的内容
    set<string> A(str,str+6);
    ostream_iterator<string,char> out(cout,"\n");
    copy(A.begin(),A.end(),out);
    return 0;
}

运行结果

可以看见其已经自动排序

一些set的类方法

lower_bound()——接受一个关键字参数,返回一个迭代器,该迭代器指向第一个不小于关键字成员的参数(可能以关键字对应数开头,也可能不是)。

upper_bound()——同上,该迭代器指向第一个大于关键词的成员(类似超尾)。

演示

#include <iostream>
#include <algorithm>
#include <set>
#include <iterator>
using namespace std;
 
int main()
{
    const int n =6;
    string str[n] = {"hello", "world", "i am", "set use","C++","union"};
    set<string> A(str,str+6);
    ostream_iterator<string,char> out(cout,"\n");
    //find string from b to r
    copy(A.lower_bound("b"),A.upper_bound("s"),out);
    return 0;
}

运行结果

因为upper_bound()返回的是类似超尾迭代器的迭代器,所以不包括以‘s’开头的字符串 

因为底层以树形结构实现得以快速查找,所以用户不能指定插入位置。并且插入后自动排序。 

multimap(多关联图)

可反转,自动排序,关键字可与数据类型不同,一个关键字可与多个数据关联。

//<const key,type_name>
mutimap <int,string> mp; 

为了将信息结合在一起,数据与关键字用一个pair存储,所以插入等操作要插入pair 
一些方法

count()——接受一个关键字参数,返回该关键字所对应得数据个数。

lower_bound(), upper_bound(),同set。

equal_range()——接受一个关键字参数,返回两个迭代器,表示与该关键字所对应的区间,并且用一个二元组封装。

演示

#include <iostream>
#include <iterator>
#include <map>
using namespace std;
typedef pair<int,string> Pair;
int main()
{
    Pair p[6]={{6,"啤酒"},
               {10,"炒饭"},
               {80,"烤猪头"},
               {10,"冷面"},
               {5,"早餐"},
               {80,"给你一锤子"}};
    multimap<int,string> mulmap;
    // no operator <
    cout << "现在图中存储的关键字和数据是:" << endl;
    multimap<int,string> ::iterator i;
    for(int i =0;i<6;i++){
        mulmap.insert(p[i]);
    }
    for(auto i=mulmap.begin(); i!=mulmap.end(); i++){
        cout << i->first << " " << i->second << endl;
    }
    cout << "使用count函数找到价格为80的菜品个数为:" << mulmap.count(80) << endl;
    pair<multimap<int,string>::iterator,multimap<int,string>::iterator> temp;
    cout << "使用equal_range函数找到价格为80的菜品" << endl;
    temp = mulmap.equal_range(80);
    for(auto i = temp.first;i!=temp.second;i++){
        cout << i->second;
    }
    return 0;
}

运行结果

map(图)和multiset(多关联集合)的使用与上面类似。

无序关联容器

可以感觉到,关联容器底层基于某种数据结构,像树,能使其快速的进项操作。但又是因为树的原因,使得每个节点必须有着严格规定。

还有无序关联容器,底层数据结构基于哈希表(每个元素对应其映射,就像关键字一样)。

有四种:

  • unordered_set
  • unordered_multiset
  • unordered_map
  • unordered_multimap

和关联序列的方大同小异,在应用场景上会有些许不同。

到此这篇关于C++实现STL容器的示例的文章就介绍到这了,更多相关C++ STL容器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现STL容器的示例

本文链接: https://www.lsjlt.com/news/138166.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++实现STL容器的示例
    各大容器的特点: 1.可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map; 特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法...
    99+
    2024-04-02
  • C++如何实现STL容器
    这篇文章给大家分享的是有关C++如何实现STL容器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。各大容器的特点:可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map;特别要注意一下,v...
    99+
    2023-06-29
  • C++中STL vector的模拟实现示例
    这篇文章主要介绍C++中STL vector的模拟实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. vector的介绍和使用vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存...
    99+
    2023-06-14
  • C++ STL中的容器适配器实现
    1 stack 1.1 stack 介绍  stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 ...
    99+
    2024-04-02
  • C++ STL容器中红黑树部分模拟实现的示例分析
    这篇文章主要介绍了C++ STL容器中红黑树部分模拟实现的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、红黑树的概念红黑树(Red Black Tree...
    99+
    2023-06-21
  • 怎么用C++模拟实现STL容器
    这篇文章主要介绍了怎么用C++模拟实现STL容器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用C++模拟实现STL容器文章都会有所收获,下面我们一起来看看吧。一、list的介绍列表是一种顺序容器,它允许在...
    99+
    2023-07-04
  • C++常见的stl容器与相关操作示例解析
    目录sort排序vectormapunordered_mapsetqueuestack创建容器时指定排序规则sort排序 针对含有迭代器的容器,可以用#include<algo...
    99+
    2022-11-13
    C++ stl容器 C++ stl容器操作
  • 利用C++模拟实现STL容器:list
    目录一、list的介绍二、list的排序三、迭代器1、list的迭代器失效问题2、迭代器的功能分类3、list迭代器的模拟实现4、迭代器价值5、迭代器operator->的重载...
    99+
    2022-12-08
    C++实现STL容器list C++ STL容器list C++ STL容器
  • C++ STL中容器适配器怎么实现
    这篇文章给大家分享的是有关C++ STL中容器适配器怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 stack1.1 stack 介绍 stack是一种容器适配器,专门用在具有后进先出操作的上...
    99+
    2023-06-14
  • C++STL中vector容器的使用
    目录一、vector(1)区分size()和capacity()(2)迭代器失效(3)区分const_iterator和const iterator(4)区分reserve()和re...
    99+
    2024-04-02
  • C++ STL反向迭代器的实现
    反向迭代器其实就行对正向迭代器进行封装,源生迭代器,为了实现运算符的结果不同,正向迭代器也对源生迭代器进行了封装。 反向迭代器的适配器,就是 Iterator是哪个容器的迭代器,re...
    99+
    2024-04-02
  • c++中stl容器干什么用的
    stl 容器在 c++ 中的作用是存储和管理各种类型的数据,从而提供数据组织、内存管理、通用性、效率和可扩展性等优势。 STL 容器在 C++ 中的作用 STL(标准模板库)容器是包含...
    99+
    2024-05-06
    c++ 标准库
  • C++ STL容器详解之红黑树部分模拟实现
    目录一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树结构 五、 红黑树的插入操作六、代码总结一、红黑树的概念 红黑树(Red Black Tree),是在计算机科学中用...
    99+
    2024-04-02
  • C++中STL的vector扩容机制
    目录 前言发生扩容扩容机制size()和capacity()reserve()和resize() 前言 前阵子面试的时候,被问到往vector中插入一个数据可能会发生什么? ...
    99+
    2023-08-31
    c++ java 面试
  • C++ STL vector的模拟实现
    1. vector的介绍和使用 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对v...
    99+
    2024-04-02
  • C++浅析STL 迭代器 容器的使用
    目录STL定义STL六大组件vectorvector嵌套容器STL定义 STL(Standard Template Library 标准模板库)STL从广义上分为:容器(contai...
    99+
    2024-04-02
  • C++ STL 中的数值算法示例讲解
    目录1.iota2.accumulate3.partial_sum4.adjacent_difference5.inner_product以下算法均包含在头文件 numeric 中 ...
    99+
    2024-04-02
  • C++标准库STL容器详解
    目录 C++标准模板库STL容器容器分类容器通用接口 顺序容器vectorlistdeque 容器适配器queuestackpriority_queue 关联容器:红黑树setmultisetmapmultimap ...
    99+
    2023-08-30
    c++ 服务器 数据结构 算法 linux 网络
  • 实现Bean容器的示例分析
    实现Bean容器的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Spring Bean 容器是什么Spring 包含并管理应用对象的配置和生命周期,...
    99+
    2023-06-15
  • Go 容器遍历的实现示例
    前文回顾 前面的文章主要介绍了 Go 语言中提供了 list 列表和 Map 映射关系容器,这两种容器都是我们日常经常使用到的。介绍了好多种的 Go 语言提供的基础容器,免不了要查...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作