能不能这样来声明变量?
std::vector<std::vector<f32>> _Data;存数据是这样的:
neatenData 是一个返回vector<f32>这个类型的一个函数。
std::vector<std::vector<f32>> _PortData; _PortData.push_back(nc->neatenData(output));
那么
取数据时候这样写错误的,那应该怎么样写呢? if (_Data.size())
{
std::vector<f32> _comData = _Data.at(_Data.begin());
_Data.erase(_Data.begin());
update(&_comData);
}

解决方案 »

  1.   

    错误代码是:error C2664: “const std::vector<_Ty> &std::vector<std::vector<_Ty>>::at(unsigned int) const”: 不能将参数 1 从“std::_Vector_iterator<_Ty,_Alloc>”转换为“unsigned int”
    1>        with
    1>        [
    1>            _Ty=irr::f32
    1>        ]
    1>        and
    1>        [
    1>            _Ty=std::vector<irr::f32>,
    1>            _Alloc=std::allocator<std::vector<irr::f32>>
    1>        ]
    1>        没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
      

  2.   

    if (_Data.size())
            {
                std::vector<f32> _comData = _Data.begin();
                _Data.erase(_Data.begin());
                update(&_comData);
            }
      

  3.   


    不行哦,还是错误的哦
    error C2440: “初始化”: 无法从“std::_Vector_iterator<_Ty,_Alloc>”转换为“std::vector<_Ty>”
    1>        with
    1>        [
    1>            _Ty=std::vector<irr::f32>,
    1>            _Alloc=std::allocator<std::vector<irr::f32>>
    1>        ]
    1>        and
    1>        [
    1>            _Ty=irr::f32
    1>        ]
    1>        无构造函数可以接受源类型,或构造函数重载决策不明确
      

  4.   

    if (_Data.size()) 
            { 
                std::vector <f32> _comData; 
                _comData.assign(_Data.begin().benin(),_Data.begin().end());
                _Data.erase(_Data.begin()); 
                update(&_comData); 
            } 
      

  5.   

    error C2039: “benin”: 不是“std::_Vector_iterator<_Ty,_Alloc>”的成员
    1>        with
    1>        [
    1>            _Ty=std::vector<irr::f32>,
    1>            _Alloc=std::allocator<std::vector<irr::f32>>
    1>        ]
      

  6.   

    改成->吧。我这没有编译器.写错了.if (_Data.size()) 
            { 
                std::vector <f32> _comData; 
                _comData.assign(_Data.begin()->begin(),_Data.begin()->end()); 
                _Data.erase(_Data.begin()); 
                update(&_comData); 
            } 
      

  7.   

    。。调试时候,vector的长度太长了。数据有这么长吗?!
      

  8.   

    _Data.at(0);   or
    _Data[0];      or 
    *_Data.begin();
      

  9.   

    调试时候,来到这里。
    static void _Xlen()
    { // report a length_error
    _THROW(length_error, "vector<T> too long");
    }
      

  10.   

    声明变量 没有问题 ! vector 是单端进单端出  如果你希望 尾进 头出 用  deque 比较方便 8 楼的意思是说 vector 已经重载了 [] 操作 这样写起来会好看些 如果更有效率的 读 应该是 STL copy 函数  
     
      

  11.   

    早期编译器必须注意
    vector< vector<int> > vecInt;
    否则会认为是左移操作。at或begin返回的都是迭代器
    所以必须声明
    vector<vector<int>>::iterator it = vecInt.at(vecInt.begin());
    另外windows环境下的eraser,比如:
    for (it = begin(); it != someVector.end();)
    {
        if (*it == value)
        { 
            it = someVector.erase(it);   // 或者someVector.erase(it++);  
        }
        else
        {
            ++it;
        }
    }
      

  12.   

    vector之类的容器没有实现=操作符,所以最好不要把其嵌套作为容器成员;可以用指针:
    std::vector<std::vector<f32>*>
    另外最好用typedef定义一下类型,看起来也清楚一些。
      

  13.   

    这是我应用的代码,请大家看看指正。
    是一个读取串口数据然后整理好发送到opengl的窗口,让opengl按照整理的数据控制节点模型
    在多线程里面运行的typedef float f32;UINT NodeControl::CommWatchProc(LPVOID pParam)
    {
    int len;
    DWORD dRes;
    int okData = 0;//正确
    int ErrData = 0;//错误 //串口数据缓冲区
    std::vector<int> rBuf; NodeControl* nc = (NodeControl*)pParam;
    const video::SExposedVideoData& videoData = nc->device->getVideoDriver()->getExposedVideoData();
    HWND h = reinterpret_cast<HWND>(videoData.OpenGLWin32.HWnd); int port = nc->Info->Port;//串口端口
    ILogger* logs = nc->device->getLogger();//系统日志
    std::vector<std::vector<f32>> _PortData; rBuf.reserve(8192);
    while(1)
    {
    dRes = WaitForSingleObject(nc->hExit, 10);
    switch(dRes)
    {
    /*got hExit event,exit thread.*/
    case WAIT_OBJECT_0:
    return 0;
    default:
    break;
    } char buf[512];
    len = sio_read(port, buf, 512);//串口数据读取
    if(len > 0)
    {
    std::vector<int> output;
    //数据保存到缓冲区
    for (int i = 0; i < len; i++)
    rBuf.push_back(buf[i]&0xFF); //寻找开始标示
    std::vector<int>::iterator c5pos = find(rBuf.begin(), rBuf.end(), 0xC5); //找不到开始标示
    if (c5pos == rBuf.end())
    continue; //复制到输出缓冲区、清除串口数据缓冲区
    output.assign(rBuf.begin(), c5pos);
    rBuf.erase(rBuf.begin(), c5pos + 1); //数据长度
    if (output.size() != 40)
    {
    logs->log("Data Length Error!");
    ErrData++;
    continue;
    } //数据校验
    int crcCheck = 0xC5;
    for (uinteger i = 0; i < output.size() - 3; i++)
    crcCheck += output.at(i);
    if ((crcCheck&0xFF) != output.at(38))
    {
    logs->log("Data Checkout Error!");
    ErrData++;
    continue;
    } _PortData.push_back(nc->neatenData(output)); PostMessage(h, WM_USER, WPARAM(&_PortData), LPARAM(ErrData + okData));
    }
    }
    return 0;
    }std::vector<f32> NodeControl::neatenData(std::vector<int> sData)
    {
    std::vector<f32> result;
    result.reserve(20); //取得分组数据并合并高低位
    result.push_back((f32)sData.at(0)  * 256 + (f32)sData.at(1) );
    result.push_back((f32)sData.at(2)  * 256 + (f32)sData.at(3) );
    result.push_back((f32)sData.at(4)  * 256 + (f32)sData.at(5) );
    result.push_back((f32)sData.at(6)  * 256 + (f32)sData.at(7) );
    result.push_back((f32)sData.at(8)  * 256 + (f32)sData.at(9) );
    result.push_back((f32)sData.at(10) * 256 + (f32)sData.at(11));
    result.push_back((f32)sData.at(12) * 256 + (f32)sData.at(13));
    result.push_back((f32)sData.at(14) * 256 + (f32)sData.at(15));
    result.push_back((f32)sData.at(16) * 256 + (f32)sData.at(17));
    result.push_back((f32)sData.at(18) * 256 + (f32)sData.at(19));
    result.push_back((f32)sData.at(20) * 256 + (f32)sData.at(21));
    result.push_back((f32)sData.at(22) * 256 + (f32)sData.at(23));
    result.push_back((f32)sData.at(24) * 256 + (f32)sData.at(25));
    result.push_back((f32)sData.at(26) * 256 + (f32)sData.at(27));
    result.push_back((f32)sData.at(28) * 256 + (f32)sData.at(29));
    result.push_back((f32)sData.at(30) * 256 + (f32)sData.at(31));
    result.push_back((f32)sData.at(32) * 256 + (f32)sData.at(33));
    result.push_back((f32)sData.at(34) * 256 + (f32)sData.at(35)); //信号量
    HSignal = sData[36] * 256 + sData[37]; return result;
    }
      

  14.   

    这个是接收处理代码:typedef float                f32; std::vector<std::vector<f32>>* _Data = (std::vector<std::vector<f32>>*)event.UserEvent.UserData1;//获得数据指针
    int len = event.UserEvent.UserData2;//接收到数据记录总数 if (_Data->size())
    {
    std::vector<f32> _comData;
    _comData.assign(_Data->begin()->begin(), _Data->begin()->end());//获取最早一组数据
    _Data->erase(_Data->begin());//清除最早一组数据。
    //这里是否需要重新整理_Data?
    update(&_comData);//更新节点状态
    }
    请各位大牛看看,那些地方不合理的。指导指导我
      

  15.   


    这里好像就是指针了的都需要_Data->begin()->begin()来操作了