访问std :: list上的最后一个节点

3
我正在尝试编写代码,遍历“pointNodes”列表,并打印每个节点的当前、前一个和后一个节点的x变量 - 除了列表中的第一个和最后一个节点,它们分别使用最后一个节点代替前一个节点和第一个节点代替下一个节点。
以下是打印列表的代码:
n = 1;
p = 1;
for (i = pointList.begin(); i != pointList.end(); ++i)
{

    if (i == pointList.begin()) // for the first node, works fine
    {
        cout << "First node! x is " << i->getX() << ", next X var is " << next(point, n)->getX() << ", previous X is " << pointList.begin()->getX() << " (n is(" << n << "), p is(" << p << ")" << endl;
        n = n + 1;
        p = p - 1;
    }
    else if (i == pointList.end()) // problem bit
    {
        cout << "Last node! x is " << i->getX() << ", next X var is " << pointList.begin()->getX() << ", previous X is " << prev(point, p)->getX() << " (n is(" << n << "), p is(" << p << ")" << endl;
        n = n + 1;
        p = p - 1;
    }
    else // for everything inbetween, works fine.
    {
        cout << "x is " << i->getX() << ", next X var is " << next(point, n)->getX() << ", previous X is " << prev(point, p)->getX() << " (n is(" << n << "), p is(" << p << ")" << endl;
        n = n + 1;
        p = p - 1;
    }



}

我知道list.end并不是链表中的最后一个节点。但我仍然不确定如何处理最后一个节点,因此需要您的帮助。我已经尝试使用 "if (pointList.back())" ,但这会导致错误消息“no operator matches these operands”。
谢谢!

一个提示:pointList.back() 返回最后一个元素的引用,而 pointList.end() 返回迭代器。你不能直接将它们等同地用作任何操作的参数。 - πάντα ῥεῖ
3个回答

2

我认为最简洁的解决方案是检查元素数量是否超过两个,然后只需迭代 begin+1end-1 的范围:

// check size, otherwise increment/decrement might be invalid
if (list.size() < 2) return;

for(it = std::next(container.begin()), end = std::prev(container.end()); it!=end; ++it)
{
    prev = std::prev(it);
    next = std::next(it);
    // output prev, it, next here
}

1
假设您的列表包含足够的元素,则修复第二个条件以测试最后一个有效元素,即 end() 前面的元素,可能是一个起点:
else if (std::next(i) == pointList.end()) // fixed problem bit

0
问题在于你需要将迭代器与最后一个元素进行比较,而不仅仅是检查列表中的最后一个元素是否为零。
更好的方法是检查迭代器是否指向 "end -1",如下所示:
else if (next(i) == pointList.end())

请注意,std::next仅在C++11中引入,因此如果不支持它,则需要自己创建语义或仅使用boost::next

刚试了一下,完美运行,谢谢!这让我疯了哈哈。 - user3601947

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接