C ++:有没有一种方法可以将各种变量类型的列表合并为一个?

时间:2020-08-24 18:45:09

标签: c++ stdlist

以下是用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;
}

1 个答案:

答案 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