以下是用Kotlin编写的所需功能:
// these 3 classes inherit from MenuItem class
val subOptions: MutableList<MenuOption> = mutableListOf(),
val entries: List<MenuEntry> = emptyList(),
val actions: List<MenuAction> = emptyList()
fun getOrderedMenuItems(): List<MenuItem> = entries.plus(actions).plus(subOptions)
是否可以使用std :: list或某些其他类型的容器来解决此问题?如果没有,该如何翻译?任何提示将不胜感激。
@edit
也许我没有说清楚。基本上,我想将这些列表连接到一个列表中。我试图像这样使用splice()和merge():
list<MenuItem> mergedList = list<MenuItem>();
mergedList.splice(mergedList.end(), actions);
我明白了:
没有重载函数“ std :: __ cxx11 :: list <_Tp,_Alloc> :: splice [带有_Tp = MenuItem,_Alloc = std :: allocator]的实例”与参数列表匹配-参数类型为:((std :: _ List_iterator,std :: __ cxx11 :: list
)-对象类型为:std :: __ cxx11 :: list
这是给我带来麻烦的方法:
list<MenuItem> MenuOption::getOrderedMenuItems() {
list<MenuItem> mergedList = list<MenuItem>();
for(MenuItem const& i : actions) {
mergedList.push_back(i);
}
for(MenuItem const& i : subOptions) {
mergedList.push_back(i);
}
for(MenuItem const& i : entries) {
mergedList.push_back(i);
}
return mergedList;
}
答案 0 :(得分:1)
您需要使用 pointers 的向量(或列表,但这是一个次等选择)(智能或其他方式;应该首选智能指针,但为简洁起见,我不展示它们)。 >
std::vector<MenuItem*> out;
// these 3 classes inherit from MenuItem class
std::vector<MenuOption*> subOptions;
std::vector<MenuEntry*> entries;
std::vector<MenuAction*> actions;
out.insert(out.end(), entries.begin(), entries.end());
out.insert(out.end(), actions.begin(), actions.end());
out.insert(out.end(), subOptions.begin(), suboptions.end());
如果需要排序的向量,则可以std::sort
out
向量。如果您对原始向量进行排序的话,也可以使用std::merge
。您可能需要将自定义比较器传递给任何一个函数,否则它们将比较指针,这可能不是您想要的。
有关更多信息,请参见this question and answer。