Die beste Struktur für die Speicherung von etwas in Array-artigen Stil mit der konstanten Zugriff auf jedes Element ist Vektor. Es ist genau so, wie Sie eine dynamische Größe haben.
Zweite Option zu gehen ist Deque. Wenn Sie planen, sehr viele Daten zu haben, gehen Sie mit diesem, da es eine bessere Speicherverwaltung hat, und Sie können es sowohl von vorne als auch von hinten bearbeiten, nicht nur zurück wie in Vektoren.
Letzte könnte Liste sein. Wenn Sie eine große Bearbeitung Ihrer Daten planen, wie das Einfügen neuer Elemente löschen (nicht nur auf diese zugreifen), sollten Sie diese als lineare Komplexität beim Einfügen/Löschen von Elementen betrachten, während die vorherigen 2 lineare plus zusätzliche lineare Zeit bis zu haben Anzahl der Elemente zwischen Position und Ende.
So Fazit:
- Vektor - einfachste
- deque - gut für große Datenspeicher
- Liste - gut für große editting Lager
Die STL-Sequenz-Container sind und einschließlich Der Header sollte wie folgt aussehen:
#include <vector>
here's reference for all STL containers
Edit: Ich sehe, dass Sie etwas anderes gemeint haben, aber ich lasse das hier und fügen Sie es hinzu.
Brauchen Sie wirklich Verbrauchsklasse? Ich meine, es wäre viel logischer, wenn Sie alle Daten über die Linie in der Line-Klasse belassen würden. Das bedeutet, dass ich entweder die Dienste, die jeden Monat im Vektor verwendet werden, bei Bedarf speichern würde, oder ich würde sofort den Preis berechnen und mich an die Dienste des letzten Monats erinnern. Ich würde auch eine Klasse namens Programm erstellen, die verwendete Dienste speichern und die Anzahl der verwendeten Dienste verwalten lassen würde. Es könnte entweder neuen Dienst verwerfen, wenn es bereits 2 gibt, oder den alten Dienst neu schreiben. Sie können auch den Preis des Programms zurückgeben und es mit der Zeit multiplizieren. Etwas wie folgt aus:
#include <vector>
using namespace std;
class Service{
public:
int getPrice(){return monthPrice;}
void setPrice(const int &p) { monthPrice = p; }
private:
int monthPrice;
};
class Program{
public:
Program(){servicesUsed = 0; monthTime = 0;}
Program(const int &t) : monthTime(t) {servicesUsed = 0;}
void setTime(int t){monthTime = t;}
void addService(Service &s);
int price(); //calculate price of program
private:
int monthTime; //time that program was used
Service services[2]; //services used in program
int servicesUsed;
};
void Program::addService(Service &s){
if(servicesUsed < 2){ // Discarding solution
services[servicesUsed] = s;
servicesUsed++;
}
}
int Program::price(){
int pP = 0;
for(int i = 0; i < servicesUsed; i++){
pP += services[i].getPrice();
}
pP *= monthTime;
return pP;
}
class Line{
public:
Program *addMonth(const int &t); //will return handle for month
int consuption(); //calculate full line consuption
private:
vector<Program> monthList; //store data about services per month
};
Program *Line::addMonth(const int &t){
monthList.push_back(Program(t));
return &monthList.back();
}
int Line::consuption(){
int p = 0;
for(unsigned int i = 0; i < monthList.size(); i++){
p += monthList[i].price();
}
return p;
}
int main(){
//showcase
Program *handle;
Service s1,s2,s3;
s1.setPrice(50);
s2.setPrice(75);
s3.setPrice(100); //probably read from file
Line line;
handle = line.addMonth(30); // monthTime probably also from file
handle->addService(s1);
handle->addService(s2);
handle->addService(s3);
handle = line.addMonth(60);
handle->addService(s3);
handle->addService(s2);
int p = line.consuption();
return 0;
}
sollte in Ordnung altought arbeiten Sie es ändern müssen;)
Diese weitgehend davon abhängen wird, welche Operationen Sie wollen sich auf die Sammlung von 'Verzehr geeignet Objekte perfrom. Willst du einen zufälligen Zugang? Möchten Sie Insertionen? Was sind typische Aktionen in der Sammlung? – sharptooth
im Grunde, wenn eine Rechnung für eine bestimmte Linie zu machen, muss die Sammlung runned throught, um die Leitung und Service von jedem Verbrauch dann die Zeilennummer ... und auch passenden hinzukommen identifizieren, wenn es sicherstellen, dass alles Zugabe respektiert wird (nicht mehr als 2 Dienste/Line/Monat, usw.) .. so für beste Art und Weise sind auf der Suche diese – meno
nur eine Randnotiz zu organisieren: Ihre 'Klasse Verzehr geeignet ist wahrscheinlich eine destructor, einen Kopierkonstruktor und einen Zuweisungsoperator fehlt. Grund dafür ist, Sie Zeiger Mitglieder haben, und wenn sie im Speicher dynamisch zugewiesen zeigen Sie dann werden Sie den Speicher in der destructor freigeben wollen und definieren tiefKopierVorgänge. – wilhelmtell