Сортировка по вектору объекта и создание подвекторов - PullRequest
0 голосов
/ 04 января 2012

Я только что удалил предыдущее сообщение с похожим вопросом, потому что мой пример был не очень понятным, поэтому я пытаюсь снова.

Я создал простой класс с именем SportsSchedules.cpp. Этот класс хранит 4 элемента;sportType, TeamName, город и количество побед.Я создал «спортивный вектор» объектов SportsSchedules.Я хочу запустить sportsVector через цикл, и для каждого вида спорта я хочу создать новый вектор.Каждый созданный субвектор должен содержать только уникальный sportType.

В идеале этот sportsVector должен выполняться в цикле и вставлять каждый объект в свой репозитивный субвектор до тех пор, пока он не станет пустым (я думаю)это код из моего основного:

#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 или указателя на функцию.Не уверен, что это то, что мне нужно, так как он создает черновую печать всех векторных индексов.Я хочу что-то, что подтолкнет - выскочит, если это возможно. Кто-то также предложил использовать карту или мульти-карту, но я не совсем понял это

Спасибо

1 Ответ

1 голос
/ 04 января 2012

Кто-то предложил вам карту, потому что это ассоциативные контейнеры.То есть.вместо того, чтобы искать определенное значение, используя позиционный индекс (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 a std::vector<SportsSchedules*>, проиндексированного значением (*itr)->getSportType().Если ключ не существует на карте (когда вы впервые видите вид спорта в sportsVector), он создаст новый, прежде чем делать это, в противном случае вы получите ранее созданный вектор.

Дляизвлеките информацию, как только она появится, вы можете найти ее по имени:

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

или выполнить итерацию по ней, чтобы получить пары (ключ, значение).Посмотрите API карты для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...