C++11 将我的for循环升级为c++;11风格
是否可以为循环升级此C++11 将我的for循环升级为c++;11风格,c++11,for-loop,C++11,For Loop,是否可以为循环升级此 hItem = m_treeHistory.InsertItem(TVIF_TEXT|TVIF_PARAM, strText, 0, 0, 0, 0, (LPARAM)psAssign, TVI_ROOT, TVI_LAST); if (psAssign->aryPtrAssignments.GetSize() > 0) { iSize = psAssign->aryPtrAssignments.GetSize();
hItem = m_treeHistory.InsertItem(TVIF_TEXT|TVIF_PARAM,
strText, 0, 0, 0, 0, (LPARAM)psAssign, TVI_ROOT, TVI_LAST);
if (psAssign->aryPtrAssignments.GetSize() > 0)
{
iSize = psAssign->aryPtrAssignments.GetSize();
for (i = 0; i < iSize; i++)
{
psAssignHist = (HIST_DATA_ASSIGN_S *)psAssign->aryPtrAssignments[i];
if (psAssign != nullptr)
{
strText = psAssignHist->datAssignment.Format(VAR_DATEVALUEONLY);
if (psAssignHist->strMethod != _T(""))
{
strText += _T(" - ");
strText += psAssignHist->strMethod;
}
if (psAssignHist->strTheme != _T(""))
{
strText += _T(" - ");
strText += psAssignHist->strTheme;
}
// AJT v10.7.0
if (strFilterText == _T("") || IsFilteredMatch(psAssignHist))
{
m_treeHistory.InsertItem(TVIF_TEXT|TVIF_PARAM,
strText, 0, 0, 0, 0, (LPARAM)psAssignHist, hItem, TVI_LAST);
}
}
}
tvs.hParent = hItem;
tvs.lParam = (LPARAM)&m_treeHistory;
tvs.lpfnCompare = CompareDateAssignHistory;
m_treeHistory.SortChildrenCB(&tvs);
}
我看过了,它表明:
for(int i: someDataStructure) doSomething();
但我不确定是否可以将此应用于我的psAssign->aryPtrAssignments
列表,该列表是HIST\u DATA\u ASSIGN
指针的cptraray
谢谢。不幸的是,它依赖于标准的库迭代器(即开始
和结束
函数),而这些函数对于来说并不存在
幸运的是,您可以创建begin
和end
函数来处理特殊容器。也许像
void** begin(CPtrArray const& arr)
{
return arr.GetData();
}
void** end(CPtrArray const& arr)
{
return arr.GetData() + arr.GetSize();
}
请注意,这些函数应该是全局非成员函数
现在,使用这些辅助功能,您应该能够使用范围for
循环:
iSize = psAssign->aryPtrAssignments.GetSize();
for (i = 0; i < iSize; i++)
{
CPtrArray myArray;
// Code to populate myArray
for (auto ptr : myArray)
{
// Do something with the pointer ptr
}
请注意,此处提供的开始
和结束
函数可用于所有需要迭代器的标准函数。不幸的是,它依赖于标准库迭代器(即开始
和结束
函数),而标准库迭代器不存在
幸运的是,您可以创建begin
和end
函数来处理特殊容器。也许像
void** begin(CPtrArray const& arr)
{
return arr.GetData();
}
void** end(CPtrArray const& arr)
{
return arr.GetData() + arr.GetSize();
}
请注意,这些函数应该是全局非成员函数
现在,使用这些辅助功能,您应该能够使用范围for
循环:
iSize = psAssign->aryPtrAssignments.GetSize();
for (i = 0; i < iSize; i++)
{
CPtrArray myArray;
// Code to populate myArray
for (auto ptr : myArray)
{
// Do something with the pointer ptr
}
请注意,此处提供的begin
和end
函数可用于所有需要迭代器的标准函数。那些begin
和end
方法如何被for
循环调用?@andrewruckle与普通函数一样,通过数组(myArray
在我的示例中)作为参数。请按照我答案中的链接进行参考,其中包括循环的等效代码示例。我明白了。因此,实际上,您建议我创建自己的CPtrArrayEx
类,该类具有这些方法,然后从CPtrArrayEx
派生数组,这样我就可以修改迭代的方式了。I see.所以最后一个逻辑问题是,是否值得进行这样的更改?@AndrewTruckle No No No,将函数设置为全局非成员函数。就是这样。在循环之前声明它们。更新了我的答案以澄清这一点。Hhhm。不过我发现:如何调用这些开始
和结束
方法
loop?@andrewruckle与普通函数一样,传递数组(myArray
,在我的示例中)作为参数。请按照我答案中的链接进行参考,其中包括循环的等效代码示例。我明白了。因此,实际上,您建议我创建自己的CPtrArrayEx
类,该类具有这些方法,然后从CPtrArrayEx
派生数组,这样我就可以修改迭代的方式了。I see.所以最后一个逻辑问题是,是否值得做出这样的更改?@AndrewTruckle不,让函数成为全局非成员函数。就是这样。在循环之前声明它们。更新了我的答案以澄清这一点。Hhhm。不过我发现了这个问题: