我想在函数的生命周期中创建一个短命列表,以收集CPoint
个对象的列表,然后迭代这些对象。我想使用CTypedPtrList
,但我不确定如何设置它以接受不是从CObject
派生的对象; CPoint
来自结构tagPOINT
。
是否可以将CTypedPtrList
与CPoint
一起使用?
否则,我应该使用std::list<CPoint>
吗? //我已经开始使用std:list
并且可以成功构建一个列表,但我找不到迭代列表的方法。
std::list<CPoint*> pointList;
// Add to the list with list.push_front(new CPoint(x, y));
std::for_each(pointList.begin(), pointList.end(), [](pointList* cur)
{
TRACE("APoint: %f, %f\n", cur->x, cur->y);
});
我试过了,但我不断被告知for_each
不是std
的成员。我尝试添加#include <for_each>
(就像我必须为list
做的那样),但它仍然无法识别。
有什么建议吗?
答案 0 :(得分:3)
我推荐std::vector
。此外,这里不需要指针:
std::vector<CPoint> pointList;
// ...
pointList.emplace_back(x, y);
// ...
for (const CPoint& p : pointList)
{
TRACE("APoint: %f, %f\n", p.x, p.y);
}
您似乎使用的是非常旧的C ++编译器。请尝试以下方法:
std::vector<CPoint> pointList;
// ...
pointList.push_back(CPoint(x, y));
// ...
for (std::vector<CPoint>::const_iterator it = pointList.begin();
it != pointList.end(); ++it)
{
TRACE("APoint: %f, %f\n", it->x, it->y);
}
答案 1 :(得分:2)
修复编译错误#include <algorithm>
并更改为:
std::for_each(pointList.begin(), pointList.end(), [](CPoint* cur)
{ ^^^^^^^^
TRACE("APoint: %f, %f\n", cur->x, cur->y);
});
或更简单地使用for range循环:
for(auto& p : pointList)
{
TRACE("APoint: %f, %f\n", p->x, p->y);
}
注意:强>
至于选择容器坚持标准容器只要你可以,std::list<>
是一个很好的选择,如果你需要一个双向链表,但在你的情况下,std::vector<>
可能只是也这样做。