gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:16:00 25 4
gpt4 key购买 nike

我有一个 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 的含义。功能做。

我第一眼看到的问题是你正在传递迭代器 innerItersplice 但是该迭代器不再指向开头,因为您在之前的 for 循环中递增了它。

主要问题:

您正在传输 my_struct 类型的元素到 std::list<std::list<my_struct>>列表。因此你得到的编译错误:你不能转换my_structstd::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
}
}

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com