Как сохранить объекты для последующего использования и сделать их доступными для поиска

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

What I'm doing:                      Example usage:

prototype

Проблема :

  1. Если я хочу получить определенную дату, мне нужно просмотреть все элементы в векторе, чтобы увидеть, совпадает ли RecPaymentsStack.stackDate с датой, запрошенной пользователем.
  2. RecPaymentStack на самом деле совершенно бесполезен в настоящий момент, потому что то, что я должен делать, - это при добавлении нового элемента проверять, был ли «RecPaymentStack.stackDate» уже сделан для Даты нового элемента. свойство, и если да, добавьте новый указатель на «RecPayments» в массив указателей внутри объекта «RecPaymentStack». Но как?

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

Подробная информация: (на случай, если я был слишком расплывчатым)

Приведенный ниже пример должен напоминать календарь, который может содержать определенные элементы (RecPayments), и эти элементы сгруппированы по дате (RecPaymentsStack).

struct RecPayments
{
    std::string name;
    Date* date;
    float cost;
};

struct RecPaymentsStack
{
    Date* stackDate; //This stack's date
    RecPayments * thePaymentItem; //Hold pointer to the actual item
};

И вот как я их сейчас храню.

std::vector<RecPaymentsStack*> RecPaymentsVector; //This vector will hold pointers to all the Recurring Payments

void addRecurring(std::string theDate,std::string theName,float theCost)
{
    //New recurring payment
    RecPayments * newPaymentItem = new RecPayments;
    //Set recurring payment properties
    newPaymentItem->name = theName;
    newPaymentItem->date = new Date(stringToChar(theDate));
    newPaymentItem->cost = theCost;

    //Add recurring payment to stack
    RecPaymentsStack * addToStack = new RecPaymentsStack;
    addToStack->stackDate = new Date(stringToChar(theDate));
    addToStack->thePaymentItem = newPaymentItem;

    //Add pointer to RecPaymentsStack to vector
    RecPaymentsVector.push_back(addToStack);
}

Итак, чтобы получить элементы для заданной даты, я просматриваю все указатели в векторе, чтобы увидеть, соответствует ли свойство "stackDate" запрошенная дата, и если это так, я использую свойство «thePaymentItem», чтобы показать фактический элемент.

void getItemsNow(Date requestedDate)
{
    std::cout << "Showing Dates for " << requestedDate << std::endl;
    unsigned int i;
    for(i=0;i<RecPaymentsVector.size();i++) //Go over all items in vector
    {
        Date dateInVector(*RecPaymentsVector[i]->stackDate); //Get the date from the vector
        if(dateInVector == requestedDate) //See if Date matches what the user requested
        {
            //Date matched, show user the item properties.
            std::cout << "Date: " << dateInVector <<
                " has name: " << RecPaymentsVector[i]->thePaymentItem->name <<
                " and price " << RecPaymentsVector[i]->thePaymentItem->cost <<
                std::endl;
        }
    }
}

3 проблемы с этим:

  1. Переход по всем элементам вектора очень неэффективен, если я только нужна пара указателей
  2. RecPaymentStack на самом деле совершенно бесполезен в настоящий момент, потому что то, что я должен делать, это при добавлении нового элемента проверять, был ли уже сделан «RecPaymentStack.stackDate» для свойства Date нового элемента, и если да, добавьте новый указатель на «RecPayments» в массив указателей внутри объекта «RecPaymentStack». Но как?
  3. Все это кажется чрезвычайно глупым с самого начала ... Наверное, есть гораздо более простой / профессиональный способ сделать это, но я не могу понять какой, вероятно, потому что я все еще мыслю как PHP-программист.

Таким образом, общая идея заключается в том, что я в конечном итоге делаю что-то вроде (глупый пример)

for each RecPaymentsStack->stackDate //For each unique Date, show it's children items.
{
    cout << "The Date is " CurrentRecPaymentsStack->stackDate and it holds the following items:
    for each CurrentRecPaymentsStack->thePaymentItem //This would now be an array of pointers
    {
        cout << "item name " CurrentRecPaymentsStack->thePaymentItem->name << " with cost " << CurrentRecPaymentsStack->thePaymentItem->cost << endl;
    }
}

Что в основном перебирает все уникальные объекты «RecPaymentsStack» (уникальные, определяемые его свойством «Дата»), и для каждой даты он затем покажет, что это «потомки» из структуры RecPayments.

И должен быть какой-то способ поиска определенной даты без необходимости перебирать все доступные даты.

9
задан greatwolf 5 December 2011 в 07:59
поделиться