如何将c++ 11中的循环转换为传统的循环

How to convert C++ 11 loop in to traditional loop?

本文关键字:循环 转换 传统 c++      更新时间:2023-10-16

我在我的程序错误C2143:语法错误:缺少','之前':',我使用Visual c++ express 2010,我认为c++ 11不支持VC 2010。

有人可以修改这段代码并解释如何在传统的for循环中恢复这个for循环吗?ouFlexSignalInfo是c++ stl中的一个列表数据类型

for(auto ouSignalInfo : ouFlexSignalInfo)   //C++11;
{
    SSignalInfo ouSignal;
    ouSignal.m_omEnggValue = ouSignalInfo.m_omEnggValue.c_str();
    ouSignal.m_omRawValue = ouSignalInfo.m_omRawValue.c_str();
    ouSignal.m_omSigName = ouSignalInfo.m_omSigName.c_str();
    ouSignal.m_omUnit = ouSignalInfo.m_omUnit.c_str();
    ouSignal.m_msgName=ouFrame.m_strFrameName.c_str();
    SigInfoArray.Add(ouSignal);
}

大致相当于:

auto iterBegin = std::begin(ouFlexSignalInfo);
auto iterEnd = std::end(ouFlexSignalInfo);
for(; iterBegin != iterEnd; ++iterBegin)
{
    auto ouSignalInfo = *iterBegin;
    //the rest of body
}

iterBeginiterEnd是ouFlexSignalInfo成员beginend返回的迭代器。

这种循环适用于所有具有begin和end成员的

如果您使用MS vc++ 2010,那么编译器将支持MS语言的基于范围的for循环扩展。代码将如下所示

for each ( auto ouSignalInfo in ouFlexSignalInfo )
{
    SSignalInfo ouSignal;
    ouSignal.m_omEnggValue = ouSignalInfo.m_omEnggValue.c_str();
    ouSignal.m_omRawValue = ouSignalInfo.m_omRawValue.c_str();
    ouSignal.m_omSigName = ouSignalInfo.m_omSigName.c_str();
    ouSignal.m_omUnit = ouSignalInfo.m_omUnit.c_str();
    ouSignal.m_msgName=ouFrame.m_strFrameName.c_str();
    SigInfoArray.Add(ouSignal);
}

或者最好写

for each ( const auto &ouSignalInfo in ouFlexSignalInfo )
{
    SSignalInfo ouSignal;
    ouSignal.m_omEnggValue = ouSignalInfo.m_omEnggValue.c_str();
    ouSignal.m_omRawValue = ouSignalInfo.m_omRawValue.c_str();
    ouSignal.m_omSigName = ouSignalInfo.m_omSigName.c_str();
    ouSignal.m_omUnit = ouSignalInfo.m_omUnit.c_str();
    ouSignal.m_msgName=ouFrame.m_strFrameName.c_str();
    SigInfoArray.Add(ouSignal);
}

由于ouFlexSignalInfo的类型未知,因此可以使用迭代器。例如

#include <iterator>
for ( auto it = std::begin( ouFlexSignalInfo ); it != std::end( ouFlexSignalInfo ); ++it )
{
    SSignalInfo ouSignal;
    ouSignal.m_omEnggValue = it->m_omEnggValue.c_str();
    ouSignal.m_omRawValue = it->m_omRawValue.c_str();
    ouSignal.m_omSigName = it->m_omSigName.c_str();
    ouSignal.m_omUnit = it->m_omUnit.c_str();
    ouSignal.m_msgName = ouFrame.m_strFrameName.c_str();
    SigInfoArray.Add( ouSignal );
}