CN109766081A - 遍历容器的方法及装置 - Google Patents
遍历容器的方法及装置 Download PDFInfo
- Publication number
- CN109766081A CN109766081A CN201910103533.5A CN201910103533A CN109766081A CN 109766081 A CN109766081 A CN 109766081A CN 201910103533 A CN201910103533 A CN 201910103533A CN 109766081 A CN109766081 A CN 109766081A
- Authority
- CN
- China
- Prior art keywords
- container
- type
- traversal
- template
- nested
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明实施例提供一种遍历容器的方法及装置,该方法包括:对待遍历的嵌套容器进行解嵌套,得到多个容器的类型;其中,嵌套容器是根据多个容器嵌套得到的容器。根据每个容器的类型对应的遍历模板,遍历嵌套容器的内容;其中,遍历模板为用于遍历对应类型的容器的内容的代码。本实施例可以减少代码编写工作量,并能够提升容器遍历的灵活性。
Description
技术领域
本发明实施例涉及计算机技术,尤其涉及一种遍历容器的方法及装置。
背景技术
容器是C++中一种常用的工具,在对包含有容器的程序进行操作的过程中,常常需要对容器中的内容进行遍历从而实现对应的操作。
现有技术在遍历容器内容时,通常需要首先确定容器的类型以及容器中包含的子元素的类型,其次根据容器的类型以及容器中包含的子元素的类型编写相应的代码,针对嵌套类型的容器,需要使用多层循环实现对容器的遍历。
然而,对于不同嵌套类型的容器,必须编写不同的代码才能实现遍历,不仅代码编写工作量大,容器的遍历还缺乏灵活性。
发明内容
本发明实施例提供一种遍历容器的方法及装置,以减少代码编写工作量,并提高容器遍历的灵活性。
第一方面,本发明实施例提供一种遍历容器的方法,包括:
对待遍历的嵌套容器进行解嵌套,得到多个容器的类型;其中,所述嵌套容器是根据所述多个容器嵌套得到的容器;
根据每个容器的类型对应的遍历模板,遍历所述嵌套容器的内容;其中,所述遍历模板为用于遍历对应类型的容器的内容的代码。
在一种可能的设计中,所述对待遍历的嵌套容器进行解嵌套,得到多个容器的类型,包括:
获取待遍历的嵌套容器的最外层容器的类型;
根据所述最外层容器的类型对应的第一遍历模板,获取所述最外层容器内的第一子元素;
根据所述第一子元素判断是否存在第二容器,若是,则获取所述第二容器的类型以及所述第二容器的类型对应的第二遍历模板;
根据所述第二遍历模板,获取第二容器内的第二子元素,重复执行根据子元素判断是否存在容器的步骤,直至根据子元素判断不存在容器为止。
在一种可能的设计中,所述根据子元素判断是否存在容器,包括:
根据子元素判断所述遍历模板中是否存在模板类函数;
若是,则调用所述模板类函数以从所述嵌套容器的嵌套类型中获取所述第二容器的类型,并获取所述第二容器的类型对应的第二遍历模板。
在一种可能的设计中,若所述遍历模板中不存在模板类函数,所述方法还包括:
根据所述子元素中存在的基本数据类型,遍历最内层的容器的内容,其中所述基本数据类型包括整型、浮点型、字符串型中的至少一种。
在一种可能的设计中,所述获取待遍历的嵌套容器的最外层容器的类型,包括:
获取所述待遍历的嵌套容器的接口函数,所述接口函数包括类型参数;
根据所述接口函数中的类型参数,获取所述最外层容器的类型。
在一种可能的设计中,不同的嵌套容器的接口函数相同。
在一种可能的设计中,各所述容器为基于C++语言实现的容器。
第二方面,本发明实施例提供一种遍历容器的装置,包括:
解嵌套模块,用于对待遍历的嵌套容器进行解嵌套,得到多个容器的类型;其中,所述嵌套容器是根据所述多个容器嵌套得到的容器;
遍历模块,用于根据每个容器的类型对应的遍历模板,遍历所述嵌套容器的内容;其中,所述遍历模板为用于遍历对应类型的容器的内容的代码。
在一种可能的设计中,所述解嵌套模块具体用于:
获取待遍历的嵌套容器的最外层容器的类型;
根据所述最外层容器的类型对应的第一遍历模板,获取所述最外层容器内的第一子元素;
根据所述第一子元素判断是否存在第二容器,若是,则获取所述第二容器的类型以及所述第二容器的类型对应的第二遍历模板;
根据所述第二遍历模板,获取第二容器内的第二子元素,重复执行根据子元素判断是否存在容器的步骤,直至根据子元素判断不存在容器为止。
在一种可能的设计中,所述解嵌套模块具体用于:
根据子元素判断所述遍历模板中是否存在模板类函数;
若是,则调用所述模板类函数以从所述嵌套容器的嵌套类型中获取所述第二容器的类型,并获取所述第二容器的类型对应的第二遍历模板。
在一种可能的设计中,若所述遍历模板中不存在模板类函数,所述遍历模块还用于:
根据所述子元素中存在的基本数据类型,遍历最内层的容器的内容,其中所述基本数据类型包括整型、浮点型、字符串型中的至少一种。
在一种可能的设计中,所述解嵌套模块具体用于:
获取所述待遍历的嵌套容器的接口函数,所述接口函数包括类型参数;
根据所述接口函数中的类型参数,获取所述最外层容器的类型。
在一种可能的设计中,不同的嵌套容器的接口函数相同。
在一种可能的设计中,各所述容器为基于C++语言实现的容器。
第三方面,本发明实施例提供一种遍历容器的设备,包括:
存储器,用于存储程序;
处理器,用于执行所述存储器存储的所述程序,当所述程序被执行时,所述处理器用于执行如上第一方面以及第一方面各种可能的设计中任一所述的方法。
第四方面,本发明实施例提供一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如上第一方面以及第一方面各种可能的设计中任一所述的方法。
本发明实施例提供一种遍历容器的方法及装置,该方法通过对待遍历的嵌套容器进行解嵌套,得到多个容器的类型;其中,嵌套容器是根据多个容器嵌套得到的容器。根据每个容器的类型对应的遍历模板,遍历嵌套容器的内容;其中,遍历模板为用于遍历对应类型的容器的内容的代码,由此不需要编写嵌套容器的代码,只需要编写各个类型的容器对应的通用的遍历模板即可,同一遍历模板可以应用于不同的嵌套容器,从而减少了代码编写的工作量,在改变嵌套容器的结构的情况下,不需要重新编写代码,根据嵌套容器解嵌套出的多个容器的类型各自对应的遍历模板即可实现对嵌套容器的内容的遍历,提升了容器遍历的灵活性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的遍历容器的方法的流程图一;
图2为本发明实施例提供的遍历容器的方法的流程图二;
图3为本发明实施例提供的遍历容器的装置的结构示意图;
图4为本发明实施例提供的遍历容器的设备的硬件结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明实施例提供的遍历容器的方法的流程图一。如图1所示,该方法包括:
S101、对待遍历的嵌套容器进行解嵌套,得到多个容器的类型;其中,嵌套容器是根据多个容器嵌套得到的容器。
在本实施例中,多个容器嵌套组成嵌套容器,其中多个容器可以对应各自的类型,多个容器的类型例如可以为vector,还例如可以为list等,本发明实施例对多个容器的类型不做特别限制,本领域技术人员可以理解,多个容器的类型可以根据需要设定为标准库容器的容器类型中的任意类型。
其中,嵌套容器是根据多个容器嵌套得到的容器,本发明实施例对具体的嵌套方式不做限制,本领域技术人员可以理解,其中嵌套容器可以为标准库容器中多个容器的任意嵌套组合。
进一步地,本实施例通过对嵌套容器中的内容进行遍历从而进行对应的容器操作,具体的,对待遍历的嵌套容器进行解嵌套得到多个容器的类型,其具体实现方式例如可以为首先获取嵌套容器的最外层容器的类型,根据最外层容器的类型得到第二层嵌套的容器,其次根据第二层嵌套的容器获取第二层容器的类型,以此类推直至得到多个容器的类型。
可选地,还例如可以为根据嵌套容器的类型直接获取每一层容器的类型,从而得到多个容器的类型,在此过程中不用具体获取每一层容器的内容,只需要得到其类型即可,以上仅为示例性的介绍,本发明实施例对此不做限制,本领域技术人员可以理解,得到多个容器的类型的具体实现方式可以根据需要进行设定。
S102、根据每个容器的类型对应的遍历模板,遍历嵌套容器的内容;其中,遍历模板为用于遍历对应类型的容器的内容的代码。
进一步地,在本实施例中,不同的容器的类型对应各自的遍历模板,其中遍历模板为用于遍历对应类型的容器的内容的代码,具体的,例如容器类型为vector时,则对应的遍历模板为用于展开遍历vector类型的容器的代码,又例如当容器的类型为list时,则对应的遍历模板为用于展开遍历list类型的容器的代码,以上仅为示例性的介绍。
具体的,要遍历一个容器中的内容,需要根据该容器的类型才能实现对其内容的访问及遍历,因此对于标准库中所有容器的类型以及已知的用户自定义的容器的类型,均预先设置有各自对应的遍历模板,不同类型的容器对应不同的遍历模板,本发明实施例对遍历模板的具体实现方式不做特别限制,本领域技术人员可以理解,遍历模板可以对应多种实现方式,可以根据需要进行选择。
进一步地,遍历模板中例如可以包含具体的对容器的操作,例如可以通过遍历嵌套容器从而实现对嵌套容器中内容的遍历,还例如可以通过遍历嵌套容器实现对嵌套容器内的数据进行求和操作等,以上仅为示例性的介绍,并非唯一的实现方式,本领域技术人员可以理解,可以根据需要在遍历模板中设置任意操作,此处对此不做限制。
在本实施例中,对所有类型的容器预先设置各自对应的遍历模板之后,可以根据嵌套容器的嵌套方式对遍历模板进行自由组合,其中的遍历模板可以反复调用,从而使得程序调试具备灵活性。
进一步地,根据多个容器的类型对应的遍历模板遍历嵌套容器的内容,具体的,例如可以首先获取最外层容器的类型,并按照最外层容器的类型对应的遍历模板对嵌套容器进行展开,展开之后得到第二层容器及其类型,其次根据第二层容器的类型对应的遍历模板对嵌套容器进行展开,依次类推直至展开至最内层容器,再按照最内层容器的类型对应的遍历模板实现对嵌套容器的内容的遍历。
可选地,还例如可以根据多个容器的类型得到多个容器的类型对应的遍历模板,其次按照嵌套容器的嵌套顺序依次访问遍历模板,从而实现遍历嵌套容器的内容,本发明实施例对遍历嵌套容器的内容的具体实现方式不做特别限制。
本发明实施例提供的遍历容器的方法,包括:对待遍历的嵌套容器进行解嵌套,得到多个容器的类型;其中,嵌套容器是根据多个容器嵌套得到的容器。根据每个容器的类型对应的遍历模板,遍历嵌套容器的内容;其中,遍历模板为用于遍历对应类型的容器的内容的代码,由此不需要编写嵌套容器的代码,只需要编写各个类型的容器对应的通用的遍历模板即可,同一遍历模板可以应用于不同的嵌套容器,从而减少了代码编写的工作量,在改变嵌套容器的结构的情况下,不需要重新编写代码,根据嵌套容器解嵌套出的多个容器的类型各自对应的遍历模板即可实现对嵌套容器的内容的遍历,提升了容器遍历的灵活性。
在上述实施例的基础上,下面结合图2对本发明实施例提供的遍历容器的方法及装置进行进一步地详细介绍。图2为本发明实施例提供的遍历容器的方法的流程图二。如图2所示,该方法包括:
S201、获取待遍历的嵌套容器的接口函数,接口函数包括类型参数。
在本实施例中,不同类型的容器对应各自不同的遍历模板,进一步地,利用统一的接口函数将所有的遍历模板进行封装得到封装接口,从而在对任意嵌套的嵌套容器进行遍历的过程中,只需要访问统一的封装接口就能够实现对嵌套容器的遍历,降低了操作的复杂度。
具体的,封装接口中包括接口函数,接口函数为遍历嵌套容器的程序入口,其中接口函数包括类型参数,下面以一个具体的接口函数的代码为例,并假设对嵌套容器进行遍历从而实现输出嵌套容器中的内容为例进行说明:
具体的,在本实施例中使用模板元编程进行接口函数以及遍历模板的实现,其中模板元编程是一种元编程技术,编译器使用模板产生暂时性的源码,然后再和剩下的源码混合并编译。这些模板的遍历包括编译时期常量、数据结构以及完整的函数,如此利用模板可以被理解为编译期的运行,采用模板元编程可以使得编写的代码更具有通用性。
其中,仅仅是假设遍历嵌套容器所进行的操作为输出嵌套容器中的内容,其余的实现方式类似,本实施例不再赘述。
参见上述代码,即为定义的接口函数的模板,其中T为类型参数,表明在该接口函数的模板中参数的类型为T,其中T可以随调用参数的变化而变化,进一步地,ctn即为待遍历的嵌套容器对应的参数,对ctn进行操作即为对待遍历的嵌套容器进行操作,将待遍历的嵌套容器传入之后即进行具体的容器遍历的操作。
以上代码仅为示例性的介绍,并非唯一的实现方式,本发明实施例对接口函数的实现方式不做限制,只要能实现其对应的功能即可。
S202、根据接口函数中的类型参数,获取最外层容器的类型。
具体的,在本实施例中,将待遍历的嵌套容器对应的参数传入接口函数,待遍历的嵌套容器自身对应某个类型,例如可以为vector和list的嵌套类型等,其次接口函数对待遍历的嵌套容器对应的参数进行模板类型推导,从而获得接口函数中的类型参数,其次根据接口函数中的类型参数获取最外层容器的类型。
以待遍历的嵌套函数参数ctn的类型是std::vector<std::list<int>>为例进行说明,此时ctn的具体类型是指最外层为一个vector容器,其中所包含的子元素为list容器,其次在list容器中包含的子元素为int类型的数据。传入参数ctn之后,编译器对__ToStr<T>::to_str(ctn)这个表达式进行模板类型推导,它发现ctn是一个vector,即推导得到的类型参数T为vector,从而获取最外层容器的类型为vector。
S203、根据最外层容器的类型对应的第一遍历模板,获取最外层容器内的第一子元素。
进一步地,根据最外层容器的类型确定其对应的第一遍历模板,其次根据第一遍历模板获取最外层容器内的第一子元素,其中第一子元素为最外层容器中包含的子元素,具体的,例如可以根据第一遍历模板对最外层容器进行展开,还例如可以根据第一遍历模板对最外层容器进行遍历等,本发明实施例对此不做限制,
下面以一个具体的第一遍历模板的代码为例进行介绍,继续沿用上述假设,此时获取ctn最外层容器的类型为vector,则按照vector对应的遍历模板获取vector内的第一子元素,其中vector对应的遍历模板例如可以为:
具体的,上述代码依旧采用模板元编程,其中vector类型的容器遍历的表达式入口为__ToStr,与接口函数中的表达式相同,因此在容器遍历执行的过程中,只需要根据容器的类型进行遍历模板的匹配,并按照对应的遍历模板执行即可。
在本实施例中,上述代码中的obj对应的即为最外层容器对应的vector容器,编译器执行代码,对最外层循环中的每一个子元素执行循环,此处以ctn的类型是std::vector<std::list<int>>为例,则每一个子元素的类型均为std::list<int>,在循环的过程中即获取了最外层的vector容器内的第一子元素list容器。
以上仅为示例性的介绍,并非唯一的实现方式,其中最外层容器的类型以及第一子元素的类型可以为任意类型,本发明实施例对此不做限制,本领域技术人员可以理解,其中第一遍历模板的实现方式可以有多种,可以根据需要进行设定,此处对此不做特别限制。
S204、根据第一子元素判断第一遍历模板是否存在模板类函数;若是,则执行S205,若否,则执行S207。
进一步地,根据第一子元素确定对应的第一遍历模板之后,判断第一遍历模板中是都存在模板类函数,在本实施例中,模板类函数为模板元编程中采用模板实现,需要进行类型推导从而实现的函数,例如在上述步骤中示例性的介绍的ctn_to_str(const T&ctn)、__ToStr<T>::to_str(ctn)均属于模板类函数,本发明实施例对模板类函数不做特别限制。
下面对存在模板类函数和不存在模板类函数的情况进行详细介绍。
S205、调用模板类函数以从嵌套容器的嵌套类型中获取第二容器的类型,并获取第二容器的类型对应的第二遍历模板。
可选地,若确定第一遍历模板中存在模板类函数,则通过调用该模板类函数从而获得嵌套容器中第二容器的类型,在本实施例中,第二容器的类型即为最外层容器包含的第一子元素对应的容器的类型,本发明实施例对第二容器的类型不做特别限制,其次根据第二容器的类型获取对应的第二遍历模板。
下面结合具体的例子进行详细介绍,参见S204中示例性的给出的第一遍历模板的代码,在第一遍历模板的代码中包含语句:__ToStr<typename std::vector<Args...>::value_type>::to_str(e),该语句即包含了模板类函数__ToStr的调用,编译器继续对这个模板类函数进行模板类型推导。
具体的,其中value_type的含义为获取子元素的类型,在示例性的说明中,ctn的类型为vector容器内部嵌套list容器,因此在本实施例中std::vector<Args...>::value_type对应的是即为list类型。
进一步地,当编译器执行至该模板类函数的语句时,获取list类型对应的第二遍历模板,通过调用第二遍历模板从而执行该模板类函数对应的语句,以上仅为示例性的介绍,并非唯一的实现方式,本发明实施例对第一遍历模板、第二遍历模板以及模板类函数的具体实现方式不做限制。
S206、根据第二遍历模板,获取第二容器内的第二子元素,重复执行根据子元素判断是否存在模板类函数的步骤,直至根据子元素判断不存在模板类为止。
其中,第二容器内包含第二子元素,在示例性的说明中,ctn的类型是std::vector<std::list<int>>,此处第二容器即为对应的list容器,则第二容器内的第二子元素即为int类型的数据。
具体的,根据第二遍历模板获取第二容器内的第二子元素,例如可以根据第二遍历模板对第二容器进行展开,还例如可以根据第二遍历模板对第二容器进行遍历等,此处对此不做限制,下面以一个具体的第二遍历模板的代码为例进行介绍:
具体的,上述代码为list类型的容器对应的遍历模板,依旧采用模板元编程,其中list类型的容器遍历的表达式入口为__ToStr,针对list类型的容器中的每一个子元素进行遍历。
在本实施例中,第二容器的类型为list,对应上述示例性介绍的第二遍历模板,其中第二遍历模板遍历的对象为第二容器内的第二子元素,在示例性的说明中,即采用第二遍历模板对list内部的int类型的数据进行遍历,从而获得第二容器list容器内的第二子元素,即至少一个int类型的子元素。
以上仅为示例性的介绍,本发明实施例对第二遍历模板的具体实现方式不做特别限制,本领域技术人员可以理解,第二遍历模板可以根据需要进行设定。
进一步地,重复执行根据子元素判断是否存在模板类函数的步骤,若根据子元素的类型确定的遍历模板中仍旧包含模板类函数,则持续根据子元素的类型确定对应的遍历模板,直至根据子元素判断不存在模板类为止。
这里需要说明的是,图2中示例性的给出了重复判断第一遍历模板中是否存在模板类函数的循环,实际上是用于表示重复执行根据子元素判断是否存在模板类函数的步骤。
S207、根据子元素中存在的基本数据类型,遍历最内层的容器的内容,其中基本数据类型包括整型、浮点型、字符串型中的至少一种。
可选地,若确定第一遍历模板中不存在模板类函数,则表明此时的第一子元素不是容器,而是一个基本数据类型的数据,即此时已经遍历到嵌套容器的最内层,对于基本数据类型的数据,不再包含容器的嵌套,直接对数据进行访问及遍历即可。
具体的,基本数据类型包括int(整型)、float(浮点型)、double(双精度浮点型)、char(字符型)或者bool(布尔型)中的至少一种,其中基本数据类型例如还可以为用户自行定义的任意数据类型,本发明实施例对此不做特别限制。
进一步地,子元素是一个基本数据类型的数据,则根据子元素中存在的基本数据类型,将最内层的容器的内容进行遍历,其中遍历的具体实现方式例如可以按照基本数据类型的遍历模板进行遍历,其中基本数据类型的遍历模板例如可以如下代码所示:
具体的,上述代码可以针对任意的基本数据类型的容器进行遍历,从而将容器中的内容进遍历,继续沿用上述假设,参见步骤S206中的介绍,获取第二容器内的第二子元素之后,判断第二遍历模板中是否存在模板类函数,编译器发现,第二遍历模板展开后的代码依旧包含了一个模板类函数的调用,即__ToStr<typename std::list<Args...>::value_type>::to_str(e),于是对此模板类函数进行类型推导发现,当前的std::list<Args...>::value_type的类型是int,为基本数据类型,因此按照基本数据类型对应的遍历模板对容器进行遍历。
具体的,编译器根据基本数据类型的遍历模板对嵌套容器进行遍历,从而遍历最内层的容器的内容,因此在本实施例中示例性的给出的std::vector<std::list<int>>类型的容器经过三次遍历模板的匹配之后,既可以实现对嵌套容器的内容的遍历。
在本实施例中,嵌套类型的容器中各容器的类型对应不同的遍历模板,根据各自的遍历模板遍历嵌套容器中的内容,具体的,使用遍历模板的嵌套调用直至调用至基本数据类型的遍历模板,从而实现对嵌套容器的内容的遍历,上述示例性的给出的代码中“return ss.str()”即为遍历嵌套容器的内容的语句,在每一层的遍历代码中都包含有遍历语句,此处并非唯一的实现方式,具体的遍历方式可以根据需要进行选择,本实施例对此不做特别限制。
可选地,在本实施例中,不同的嵌套容器的接口函数相同,例如在上述示例性的介绍中,ctn_to_str(const T&ctn)作为接口函数,通过采用统一的接口函数,在需要进行容器的遍历时,只需要对接口函数进行访问并将需要遍历的容器的参数传入,既可以实现对容器的遍历,从而降低了操作难度,提升了遍历的效率。
以上仅为示例性的介绍,并非唯一的实现方式,本发明实施例通过根据容器的类型匹配对应的遍历模板,可以对任意嵌套的容器的类型进行遍历,例如还可以对下面所示的嵌套容器进行打印:
std::vector<int>v({1,2});//v为vector类型的容器//
std::vector<std::vector<int>>vv(2,v);//vv为vector类型内部嵌套vector类型的容器//
std::list<std::vector<int>>lv(2,v);//lv为list类型内部嵌套vector类型的容器//
std::vector<std::list<std::vector<int>>>vlv(2,lv);//vlv为vector类型内部嵌套了list类型的容器,其中list类型的容器内部还嵌套vector类型的容器//
std::cout<<ctn_to_str(v)<<std::endl;
std::cout<<ctn_to_str(vv)<<std::endl;
std::cout<<ctn_to_str(lv)<<std::endl;
std::cout<<ctn_to_str(vlv)<<std::endl;//将嵌套容器的参数传入接口函数//
本领域技术人员可以理解,上述实施例中介绍的遍历模板以及容器类型可以根据需要进行设定,此处对此不做特别限制。
本发明实施例提供的遍历容器的方法,包括:获取待遍历的嵌套容器的接口函数,接口函数包括类型参数。根据接口函数中的类型参数,获取最外层容器的类型。根据最外层容器的类型对应的第一遍历模板,获取最外层容器内的第一子元素。根据第一子元素判断第一遍历模板是否存在模板类函数,若是,则调用模板类函数以从嵌套容器的嵌套类型中获取第二容器的类型,并获取第二容器的类型对应的第二遍历模板。根据第二遍历模板,获取第二容器内的第二子元素,重复执行根据子元素判断是否存在模板类函数的步骤,直至根据子元素判断不存在模板类为止。根据每个容器的类型对应的遍历模板,遍历嵌套容器的内容;其中,遍历模板为用于遍历对应类型的容器的内容的代码。若否,则根据子元素中存在的基本数据类型,遍历最内层的容器的内容,其中基本数据类型包括整型、浮点型、字符串型中的至少一种。通过根据嵌套容器中不同的容器的类型匹配对应的遍历模板,其次按照遍历模板将嵌套容器的内容进行遍历,从而能够实现对任意嵌套的容器进行遍历,从而避免了针对每一种嵌套类型的容器都要采用不同的代码才能实现遍历,其次通过统一的接口函数作为嵌套容器遍历的接口,从而提升了遍历操作的效率,减少复杂度,增加程序调试的灵活性。
进一步地,在上述实施例的基础上,在本发明实施例中,各容器为基于C++语言实现的容器,其中容器的类型包括但不限于:std::array、std::deque、std::forward_list、std::list、std::vector、std::map、std::unordered_map、std::multimap、std::unordered_multimap、std::set、std::multiset、std::unordered_multiset、std::tuple、std::pair,还例如可以为用户自定义的容器类型等,本发明实施例对此不做限制。
通过对C++语言实现的各类型的容器进行遍历模板的编写,从而保证对于C++中任意嵌套的容器都能实现遍历,保证了容器遍历的有效进行。
本领域技术人员可以理解,本实施例中所涉及的代码仅为示意性的用于理解的代码,其实现环境和实现原理不做特别限制。其中,所涉及的代码可以为实现过程中的部分代码而不是全部代码,本实施例对实现过程中的全部代码不再赘述。其中,//……//代表对部分代码的解释说明,对于其它代码的含义,可根据本领域常规代码的含义确定。
图3为本发明实施例提供的遍历容器的装置的结构示意图。如图3所示,该装置30包括:解嵌套模块301以及遍历模块302。
解嵌套模块301,用于对待遍历的嵌套容器进行解嵌套,得到多个容器的类型;其中,嵌套容器是根据多个容器嵌套得到的容器;
遍历模块302,用于根据每个容器的类型对应的遍历模板,遍历嵌套容器的内容;其中,遍历模板为用于遍历对应类型的容器的内容的代码。
在一种可能的设计中,解嵌套模块301具体用于:
获取待遍历的嵌套容器的最外层容器的类型;
根据最外层容器的类型对应的第一遍历模板,获取最外层容器内的第一子元素;
根据第一子元素判断是否存在第二容器,若是,则获取第二容器的类型以及第二容器的类型对应的第二遍历模板;
根据第二遍历模板,获取第二容器内的第二子元素,重复执行根据子元素判断是否存在容器的步骤,直至根据子元素判断不存在容器为止。
在一种可能的设计中,解嵌套模块301具体用于:
根据子元素判断遍历模板中是否存在模板类函数;
若是,则调用模板类函数以从嵌套容器的嵌套类型中获取第二容器的类型,并获取第二容器的类型对应的第二遍历模板。
在一种可能的设计中,若遍历模板中不存在模板类函数,遍历模块302还用于:
根据子元素中存在的基本数据类型,遍历最内层的容器的内容,其中基本数据类型包括整型、浮点型、字符串型中的至少一种。
在一种可能的设计中,解嵌套模块301具体用于:
获取待遍历的嵌套容器的接口函数,接口函数包括类型参数;
根据接口函数中的类型参数,获取最外层容器的类型。
在一种可能的设计中,不同的嵌套容器的接口函数相同。
在一种可能的设计中,各容器为基于C++语言实现的容器。
本实施例提供的装置,可用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,本实施例此处不再赘述。
图4为本发明实施例提供的遍历容器的设备的硬件结构示意图,如图4所示,本实施例的遍历容器的设备40包括:处理器401以及存储器402;其中
存储器402,用于存储计算机执行指令;
处理器401,用于执行存储器存储的计算机执行指令,以实现上述实施例中遍历容器的方法所执行的各个步骤。具体可以参见前述方法实施例中的相关描述。
可选地,存储器1102既可以是独立的,也可以跟处理器1101集成在一起。
当存储器112独立设置时,该遍历容器的设备还包括总线1103,用于连接所述存储器1102和处理器1101。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上遍历容器的设备所执行的遍历容器的方法。
在本发明所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本申请各个实施例所述方法的部分步骤。
应理解,上述处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application Specific Integrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器可能包含高速RAM存储器,也可能还包括非易失性存储NVM,例如至少一个磁盘存储器,还可以为U盘、移动硬盘、只读存储器、磁盘或光盘等。
总线可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(Peripheral Component,PCI)总线或扩展工业标准体系结构(ExtendedIndustry Standard Architecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本申请附图中的总线并不限定仅有一根总线或一种类型的总线。
上述存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。存储介质可以是通用或专用计算机能够存取的任何可用介质。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (16)
1.一种遍历容器的方法,其特征在于,包括:
对待遍历的嵌套容器进行解嵌套,得到多个容器的类型;其中,所述嵌套容器是根据所述多个容器嵌套得到的容器;
根据每个容器的类型对应的遍历模板,遍历所述嵌套容器的内容;其中,所述遍历模板为用于遍历对应类型的容器的内容的代码。
2.根据权利要求1所述的方法,其特征在于,所述对待遍历的嵌套容器进行解嵌套,得到多个容器的类型,包括:
获取待遍历的嵌套容器的最外层容器的类型;
根据所述最外层容器的类型对应的第一遍历模板,获取所述最外层容器内的第一子元素;
根据所述第一子元素判断是否存在第二容器,若是,则获取所述第二容器的类型以及所述第二容器的类型对应的第二遍历模板;
根据所述第二遍历模板,获取第二容器内的第二子元素,重复执行根据子元素判断是否存在容器的步骤,直至根据子元素判断不存在容器为止。
3.根据权利要求2所述的方法,其特征在于,所述根据子元素判断是否存在容器,包括:
根据子元素判断所述遍历模板中是否存在模板类函数;
若是,则调用所述模板类函数以从所述嵌套容器的嵌套类型中获取所述第二容器的类型,并获取所述第二容器的类型对应的第二遍历模板。
4.根据权利要求3所述的方法,其特征在于,若所述遍历模板中不存在模板类函数,所述方法还包括:
根据所述子元素中存在的基本数据类型,遍历最内层的容器的内容,其中所述基本数据类型包括整型、浮点型、字符串型中的至少一种。
5.根据权利要求2所述的方法,其特征在于,所述获取待遍历的嵌套容器的最外层容器的类型,包括:
获取所述待遍历的嵌套容器的接口函数,所述接口函数包括类型参数;
根据所述接口函数中的类型参数,获取所述最外层容器的类型。
6.根据权利要求5所述的方法,其特征在于,不同的嵌套容器的接口函数相同。
7.根据权利要求1至6任一项所述的方法,其特征在于,各所述容器为基于C++语言实现的容器。
8.一种遍历容器的装置,其特征在于,包括:
解嵌套模块,用于对待遍历的嵌套容器进行解嵌套,得到多个容器的类型;其中,所述嵌套容器是根据所述多个容器嵌套得到的容器;
遍历模块,用于根据每个容器的类型对应的遍历模板,遍历所述嵌套容器的内容;其中,所述遍历模板为用于遍历对应类型的容器的内容的代码。
9.根据权利要求8所述的装置,其特征在于,所述解嵌套模块具体用于:
获取待遍历的嵌套容器的最外层容器的类型;
根据所述最外层容器的类型对应的第一遍历模板,获取所述最外层容器内的第一子元素;
根据所述第一子元素判断是否存在第二容器,若是,则获取所述第二容器的类型以及所述第二容器的类型对应的第二遍历模板;
根据所述第二遍历模板,获取第二容器内的第二子元素,重复执行根据子元素判断是否存在容器的步骤,直至根据子元素判断不存在容器为止。
10.根据权利要求9所述的装置,其特征在于,所述解嵌套模块具体用于:
根据子元素判断所述遍历模板中是否存在模板类函数;
若是,则调用所述模板类函数以从所述嵌套容器的嵌套类型中获取所述第二容器的类型,并获取所述第二容器的类型对应的第二遍历模板。
11.根据权利要求10所述的装置,其特征在于,若所述遍历模板中不存在模板类函数,所述遍历模块还用于:
根据所述子元素中存在的基本数据类型,遍历最内层的容器的内容,其中所述基本数据类型包括整型、浮点型、字符串型中的至少一种。
12.根据权利要求9所述的装置,其特征在于,所述解嵌套模块具体用于:
获取所述待遍历的嵌套容器的接口函数,所述接口函数包括类型参数;
根据所述接口函数中的类型参数,获取所述最外层容器的类型。
13.根据权利要求12所述的装置,其特征在于,不同的嵌套容器的接口函数相同。
14.根据权利要求8至13任一项所述的装置,其特征在于,各所述容器为基于C++语言实现的容器。
15.一种遍历容器的设备,其特征在于,包括:
存储器,用于存储程序;
处理器,用于执行所述存储器存储的所述程序,当所述程序被执行时,所述处理器用于执行如权利要求1至7中任一所述的方法。
16.一种计算机可读存储介质,其特征在于,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1至7中任一所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910103533.5A CN109766081B (zh) | 2019-02-01 | 2019-02-01 | 遍历容器的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910103533.5A CN109766081B (zh) | 2019-02-01 | 2019-02-01 | 遍历容器的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109766081A true CN109766081A (zh) | 2019-05-17 |
CN109766081B CN109766081B (zh) | 2022-03-08 |
Family
ID=66456033
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910103533.5A Active CN109766081B (zh) | 2019-02-01 | 2019-02-01 | 遍历容器的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109766081B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112800194A (zh) * | 2021-01-15 | 2021-05-14 | 亿企赢网络科技有限公司 | 一种接口变更识别方法、装置、设备及存储介质 |
CN117093288A (zh) * | 2023-08-18 | 2023-11-21 | 江苏新质信息科技有限公司 | 基于前后台通信的数据双向映射方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5987255A (en) * | 1997-03-12 | 1999-11-16 | International Business Machines Corporation | Method of, system for, and article of manufacture for providing a generic adaptor for converting from a sequential iterator to a pre-thread parallel iterator |
CN106168923A (zh) * | 2016-06-30 | 2016-11-30 | 北京奇虎科技有限公司 | 一种功能遍历与界面遍历方法及系统 |
-
2019
- 2019-02-01 CN CN201910103533.5A patent/CN109766081B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5987255A (en) * | 1997-03-12 | 1999-11-16 | International Business Machines Corporation | Method of, system for, and article of manufacture for providing a generic adaptor for converting from a sequential iterator to a pre-thread parallel iterator |
CN106168923A (zh) * | 2016-06-30 | 2016-11-30 | 北京奇虎科技有限公司 | 一种功能遍历与界面遍历方法及系统 |
Non-Patent Citations (2)
Title |
---|
王威 等: "C++高层次抽象效率分析", 《无线互联科技》 * |
瓜枣三郎: "stl中list容器的嵌套", 《CSDN》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112800194A (zh) * | 2021-01-15 | 2021-05-14 | 亿企赢网络科技有限公司 | 一种接口变更识别方法、装置、设备及存储介质 |
CN112800194B (zh) * | 2021-01-15 | 2023-11-17 | 亿企薪福网络科技有限公司 | 一种接口变更识别方法、装置、设备及存储介质 |
CN117093288A (zh) * | 2023-08-18 | 2023-11-21 | 江苏新质信息科技有限公司 | 基于前后台通信的数据双向映射方法及装置 |
CN117093288B (zh) * | 2023-08-18 | 2024-04-30 | 江苏新质信息科技有限公司 | 基于前后台通信的数据双向映射方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN109766081B (zh) | 2022-03-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11386644B2 (en) | Image preprocessing for generalized image processing | |
CN111630502B (zh) | 用于神经网络处理器的统一存储器组织 | |
KR101640295B1 (ko) | 정규 표현을 컴파일하기 위한 방법 및 장치 | |
KR910009116B1 (ko) | 레지스터 할당 및 지정 방법 | |
US9117176B2 (en) | Round-trip engineering apparatus and methods for neural networks | |
CN103547999B (zh) | 利用专用元件实施有限状态机 | |
US8127283B2 (en) | Enabling graphical notation for parallel programming | |
US20130073500A1 (en) | High level neuromorphic network description apparatus and methods | |
TWI703451B (zh) | 處理器操作方法、相關電腦系統、及非暫時性電腦可存取儲存媒體 | |
US11900113B2 (en) | Data flow processing method and related device | |
EP2825974A1 (en) | Tag-based apparatus and methods for neural networks | |
US11556756B2 (en) | Computation graph mapping in heterogeneous computer system | |
CN110889439B (zh) | 一种图像特征提取方法、装置及电子设备和存储介质 | |
CN103064721A (zh) | 多种解释性编程语言间的第一类对象共享 | |
US11720332B2 (en) | Compiling a program from a graph | |
CN110717584A (zh) | 神经网络编译方法、编译器、计算机设备及可读存储介质 | |
JPH11513512A (ja) | ディジタル信号プロセッサの製造方法 | |
CN111104120A (zh) | 神经网络编译方法、系统及相应异构计算平台 | |
CN114416045A (zh) | 自动生成算子的方法和装置 | |
CN103870335B (zh) | 用于信号流编程的数字信号处理器代码的高效资源管理的系统和方法 | |
CN109766081A (zh) | 遍历容器的方法及装置 | |
CN108595917A (zh) | 基于fpga的面向基因测序串匹配算法的加速平台及设计方法 | |
CN112269581A (zh) | 一种可重构芯片的内存耦合编译方法及系统 | |
CN116523023A (zh) | 算子融合方法及装置、电子设备与存储介质 | |
Harman et al. | Algebraic models and the correctness of microprocessors |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |