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。不过我发现了这个问题: