通过无序集访问类数据无法正常工作

Accessing Class Data through unordered set not working properly?

本文关键字:常工作 工作 无序 访问 数据      更新时间:2023-10-16

在访问我的数据成员时遇到问题,我可以用第二双眼睛看看发生了什么。我的所有类get函数都遵循以下格式:dataType getItem()const{return item};

这是我的代码:

void listHash(int N, int MIN, string OFF, string DEF, int DOWN, int TOGO, int YARDLINE, vector<NFLData>& vdata){
    vector<NFLData> relevance;
    unordered_set<NFLData> data;
    for(int i = 0; i < vdata.size(); i++){
        data.insert(NFLData(vdata[i].getLine()));
    }
    unordered_set<NFLData>::iterator itr = data.begin();
    for(itr; itr != data.end(); ++itr){
        if(OFF == itr->getOffenseTeam()){
            if(DOWN == itr.getDown()){
            float rel;
            rel = -( (float)( abs(MIN - data->getMinute()) * (float)(5/3)) + (float)abs(TOGO - data->getYardsToGo() ) + (float)abs(YARDLINE - data->getYardline()) );
            if(DEF== itr->getOffenseTeam()){
                rel +=100;
            }
            string datas;
            datas = itr->getLine();
            relevance.push_back(NFLData(datas));
            }
        }
    }

以下是我尝试从迭代器中调用函数时的错误:

driver_broke.cpp: In function âvoid listHash(int, int, std::string, std::string, int, int, int, std::vector<NFLData, std::allocator<NFLData> >&)â:
driver_broke.cpp:167: error: âstruct std::tr1::__detail::_Hashtable_iterator<NFLData, true, false>â has no member named âgetDownâ
driver_broke.cpp:169: error: base operand of â->â has non-pointer type âstd::tr1::unordered_set<NFLData, std::tr1::hash<NFLData>, std::equal_to<NFLData>, std::allocator<NFLData> >â
driver_broke.cpp:169: error: base operand of â->â has non-pointer type âstd::tr1::unordered_set<NFLData, std::tr1::hash<NFLData>, std::equal_to<NFLData>, std::allocator<NFLData> >â
driver_broke.cpp:169: error: base operand of â->â has non-pointer type âstd::tr1::unordered_set<NFLData, std::tr1::hash<NFLData>, std::equal_to<NFLData>, std::allocator<NFLData> >â

迭代程序具有指针语义。因此,应该使用->通过迭代器访问成员:

if(DOWN == itr->getDown())
//            ^^
//           Here

计算rel时,您引用的是data而不是itr:

rel = -( (float)( abs(MIN - itr->getMinute()) * (float)(5/3)) + (float)abs(TOGO - itr->getYardsToGo() ) + (float)abs(YARDLINE - itr->getYardline()) );