2017-03-16 20 views
0

可以升级这个for循环吗?将我的for循环升级到C++ 11样式

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循环:

iSize = psAssign->aryPtrAssignments.GetSize(); 
for (i = 0; i < iSize; i++) 
{ 

我已经看过here和它表明:

for(int i: someDataStructure) doSomething(); 

但我不知道我是否可以采用这个我psAssign->aryPtrAssignments列表,它是HIST_DATA_ASSIGN_S指针的CPtrArray

谢谢。

回答

2

不幸的是,ranged for loop依赖于CPtrArray不存在的标准库迭代器(即beginend函数)。

幸运的是,您可以创建beginend函数来处理特殊容器。也许类似

void** begin(CPtrArray const& arr) 
{ 
    return arr.GetData(); 
} 

void** end(CPtrArray const& arr) 
{ 
    return arr.GetData() + arr.GetSize(); 
} 

注意,这些应该是全球非成员函数。现在

与这些辅助功能,你应该能够使用远程for循环:

CPtrArray myArray; 

// Code to populate myArray 

for (auto ptr : myArray) 
{ 
    // Do something with the pointer ptr 
} 

注意,这里给出的beginend功能可用于所有标准函数,希望迭代器。

+0

这些'begin'和'end'方法如何被'for'循环调用? –

+1

@AndrewTruckle就像普通函数一样,传递数组(在我的例子中是'myArray')作为参数。请按照我的答案中的链接参考,其中包括循环的等效代码示例。 –

+0

我明白了。所以真的,你建议我制作自己的具有这些方法的'CPtrArrayEx'类,然后从'CPtrArrayEx'派生** my **数组,然后我就可以修改迭代的方式。我懂了。所以最后的逻辑问题是,值得做出这样的改变吗? –