排序通过对象向量和创建子向量

Sorting through an object vector and creating subvectors

本文关键字:向量 创建 对象 排序      更新时间:2023-10-16

我刚刚删除了一个类似的问题,因为我的例子不是很清楚,所以我再试一次。

我已经创建了一个简单的类SportsSchedules.cpp类存储4项;体育类型,球队名称,城市和胜利的数量。我已经创建了SportsSchedules对象的"运动向量"。我想通过循环运行sportsVector,并为每个运动类型创建一个新向量。每个创建的子向量应该只包含唯一的sportType。

理想情况下,这个sportsVector将在循环中运行,并将每个对象弹出到各自的子向量中,直到它为空(我猜)

下面是我的main代码:

#include <iostream>
#include "SportsSchedules.h"
#include <vector>
#include <string>
#include <map>
#include <algorithm>
#include <functional>
bool sportType( std::string type);
int main (int argc, const char * argv[])
{
    SportsSchedules *theSport;
    theSport = new SportsSchedules("Football", "Chicago", "Bears", 7);
    std::vector<SportsSchedules*> *sportsVector = new std::vector<SportsSchedules*>();
    sportsVector->push_back(theSport);
    theSport = NULL;
    theSport = new SportsSchedules("Football", "Chicago", "Bears", 7);
    sportsVector->push_back(theSport);
    theSport = NULL;
    theSport = new SportsSchedules("Baseball", "Boston", "RedSox", 62);
    sportsVector->push_back(theSport);
    theSport = NULL;
    theSport = new SportsSchedules("Football", "GreenBay", "Packers", 15);
    sportsVector->push_back(theSport);
    theSport = NULL;
    theSport = new SportsSchedules("Basketball", "Portland", "Trailblazers", 60);
    sportsVector->push_back(theSport);
    theSport = NULL;
    theSport = new SportsSchedules("Football", "Seattle", "Seahawks", 7);
    sportsVector->push_back(theSport);
    theSport = NULL;
    theSport = new SportsSchedules("Baseball", "Oakland", "A's", 67);
    sportsVector->push_back(theSport);
    std::cout<<"Test the SportsSchedules Vector "<<std::endl;
    std::vector<SportsSchedules*>::iterator itr;
    for(itr = sportsVector->begin(); itr != sportsVector->end(); ++itr ){
        std::cout<<(*itr)->getSportType()<<"  "<<(*itr)->getCity()<<"  "<<(*itr)->getTeamName()<<"  "
        <<(*itr)->getNumWins()<<std::endl;
    }
    return 0;
}

bool trackType( std::string type){
    SportsSchedules * sptPtr;
    if(sptPtr->getSportType()== type)
        return true;
    else
        return false;
}

bool函数来自于先前尝试remove_copy_if。我一直得到一个编译器错误关于没有int指针或函数指针。不确定如果这是我需要的,因为它创建了所有矢量索引的蓝图。如果可能的话,我想要一些可以push - pop的东西,有人还建议使用map或multi map,但我不太理解它

谢谢

有人建议你使用映射,因为它们是关联容器。Ie。与使用位置索引(0,1,2,…)查找特定值不同,您可以使用任意值进行查找,例如,可以是字符串。

那么,它怎么会对你有用呢?请看下面的例子:

#include <map>
#include <string>
#include <vector>
#include <iostream>
int main() {
        std::map< std::string, std::vector<SportsSchedules*> > uniques;
        // Initialization code here...
        std::vector<SportsSchedules*>::iterator itr;
        for(itr = sportsVector->begin(); itr != sportsVector->end(); ++itr ) {
            uniques[(*itr)->getSportType()].push_back((*itr));
        }
        return 0;
}       

uniques[(*itr)->getSportType()]uniques检索到(*itr)->getSportType()值索引的std::vector<SportsSchedules*>。如果这个键在地图上不存在(你第一次在sportsVector中看到这个运动),它会先创建一个新的,否则,你会得到之前创建的向量。

要检索信息,一旦它在那里,你可以查找它的名称:

std::vector<SportsSchedules*> vec = uniques["Football"];

或对其进行迭代以获得(键,值)对。查看map的API获取更多信息