?
Ein Auto hat ein Lenkrad (1-Komposition), einen Koffer im Kofferraum (0..1-Aggregation, kann ja kein Koffer da sein und der Koffer lebt auch ohne Auto weiter) und 4 Räder (4-Komposition), aber n-Insassen (n <= 5, n-Aggregation), was sich so abbildet:
class Auto
{
private:
Lenkrad m_lenkrad;
Koffer* m_pKoffer; // NULL bei 0, Zeiger bei einem Koffer
Rad m_Rad[4]; // Anzahl fest, Komposition => normales Array
std::vector<Person*> m_Insassen; // Anzahl dynamisch, Objekte leben weiter (Aggregation)
};
Aggregation, 1 Element Referenz auf Objektinstanz
Aggregation, 0..1 Elemente Zeiger auf Objektinstanz, NULL zeigt 0 an
Aggregation, n Elemente Array aus Zeigern auf Objektinstanzen
Aggregation, 0..* Elemente dyn. Array (vector<T*>, list<T*>) aus Zeigern auf Objektinstanzen
Komposition, 1 Element Objektinstanz
Komposition, 0..1 Elemente Zeiger auf Objektinstanz, NULL zeigt 0 an
Komposition, n Elemente Array aus Objektinstanzen
Komposition, 0..* Elemente dyn. Array (vector<T>, list<T>) aus Objektinstanzen
Listen sind stark darin, an beliebigen Stellen Elemente einzufügen und zu entfernen, dafür kannst du sie nur sequentiell durchlaufen (also nicht bspw. direkt auf das 10. Element zugreifen).
Vektoren dagegen haben diesen Random-Access, dafür ist das Einfügen und Entfernen in der Mitte oder am Anfang extrem ineffizient (am Ende Einfügen (push_back) ist OK)
(stammt von Marcus Bäckmann, soweit ich weiß)