如何使用 splice() 在 C++ 中重组列表列表

How to restructure a list of lists in C++ using splice()

我有 listslist,元素类型为 my_struct。我使用两个迭代器(一个用于外部列表,一个用于内部列表)遍历每个元素并进行一些计算。每次我传递一个内部列表时,我都会检查一个标准并(如有必要)尝试使用 splice() 函数将这个内部列表分成两部分。我想将内部列表的第二部分重新定位到外部列表(就在当前内部列表之后)。

这是我目前得到的:

std::list<std::list<my_struct>> myList;
std::list<std::list<my_struct>>::iterator outerIter;
std::list<my_struct>::iterator innerIter;

for (outerIter = myList.begin(); outerIter != myList.end(); outerIter++)
{
    std::list<my_struct> &listEntry = *outerIter;

    for (innerIter = listEntry.begin(); innerIter != listEntry.end(); innerIter++)
    {
        // some calculations
    }

    if (criterion)
    {
        myList.splice(outerIter, listEntry, innerIter, listEntry.end());
    }
}

此代码要做的是将 std::list<my_struct>innerIter 开始并在 listEntry.end() 结束作为新的内部列表重新定位在当前检查的内部列表之后。

希望你能明白我的意思,因为我不知道怎么解释才好理解。

我已经尝试了不同的方式来编写 splice 部分,但我总是收到错误。

所以,如果有人知道如何正确编程,那么我很乐意得到一些帮助。

首先,我认为您误解了 splice 函数的作用。

我第一眼看到的问题是您将迭代器 innerIter 传递给 splice 但是 迭代器没有指向不再开始,因为您在之前的 for 循环中递增了它。

主要问题:

您正在将 my_struct 类型的元素转移到 std::list<std::list<my_struct>> 列表。因此,您得到的编译错误是:您无法将 my_struct 转换为 std::list<my_struct>,如果您搜索详细错误,您会发现 _Ty 确实是 my_struct

所以,这就是你必须做的:

  1. 创建将接收元素的新列表。
  2. 转移元素。
  3. 在您想要的位置插入新列表。

在 C++ 中(警告未测试):

for (auto outerIter = myList.begin(); outerIter != myList.end(); outerIter++)
{
    std::list<my_struct> &listEntry = *outerIter;

    for (auto innerIter = listEntry.begin(); innerIter != listEntry.end(); innerIter++)
    {
        // some calculations
    }

    if (criterion)
    {
        // you need point the next element, in roder to insert after the current outerIter position. 
        MyList::iterator tmp = outerIter;
        std::list<my_struct> list_to_insert;                                                            // 1
        list_to_insert.splice(list_to_insert.begin(), listEntry, listEntry.begin(), listEntry.end());   // 2
        myList.insert(++tmp, list_to_insert);                                                   // 3
    }
}