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

时间:2014-05-04 19:04:18

标签: c++ linked-list

我正在尝试编写遍历“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())”,但是这给了我一个“没有运算符匹配这些操作数”的错误。

谢谢!

3 个答案:

答案 0 :(得分:2)

我认为您最干净的解决方案会检查是否有两个以上的元素,然后只是在begin+1范围内迭代到end-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 :(得分:1)

鉴于您的列表包含足够的元素,可能是开始修复第二个条件以测试最后一个有效元素,即之前的 {{ 1}}:

end()

答案 2 :(得分:0)

  

问:我尝试过“if(pointList.back())”,但这给了我一个“没有运算符匹配这些操作数”的错误。

该方法的问题是您需要将迭代器与最后一个元素进行比较,而不仅仅是检查列表中的最后一个元素是否为零。

更好的方法是检查迭代器是否指向“end -1”,如下所示:

else if (next(i) == pointList.end())

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