我正在尝试编写代码,通过'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;
}
}
我意识到这个列表。End实际上并不意味着列表中的最后一个节点。我仍然不确定如何为最后一个节点做一些不同的事情,所以我很感激任何帮助。我尝试过"if (pointList.back())",但这给了我一个"没有操作符匹配这些操作数"的错误。
谢谢!
我认为你最干净的解决方案检查有两个以上的元素,然后简单地在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
}
如果您的列表包含足够的元素,则可以开始修复第二个条件以测试最后一个有效的元素,即 end()
:
else if (std::next(i) == pointList.end()) // fixed problem bit
Q:我试过"if (pointList.back())"代替,但这给了我一个"没有操作符匹配这些操作数"的错误。
这种方法的问题在于你需要将迭代器与最后一个元素进行比较,而不仅仅是检查列表中最后一个元素是否为零。
更好的方法是检查迭代器是否指向"end -1",如下所示:else if (next(i) == pointList.end())
请注意,std::next
仅在c++ 11中引入,因此不支持它,您需要自己创建语义或仅使用boost::next
。