如何使用 splice() 在 C++ 中重组列表列表
How to restructure a list of lists in C++ using splice()
我有 lists
的 list
,元素类型为 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
}
}
我有 lists
的 list
,元素类型为 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
}
}