我有一个listlists,其元素类型为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

因此,这是您要做的:


创建将列出元素的新列表。
转移元素。
在所需位置插入新列表。


在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
    }
}

关于c++ - 如何使用splice()在C++中重构列表列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30302113/

10-15 00:22
查看更多