Что такое композиция
Композиция (в терминах UML) - это ассоциация, когда данный объект является «частью» других объектов, то есть имеет одинаковое время жизни и, что является наиболее важным и характерным, не существует / имеет смысл сам по себе .
Согласно этому описанию, состав - это не то, чего мы хотим достичь - см. Вторую часть.
В C или C ++ лучший способ реализовать композицию без использования указателей:
class Edge {
int id;
Vertex source;
Vertex target;
};
Этот подход является наилучшим с точки зрения использования памяти (один блок памяти для всего объекта вместе с составными объектами) и, вероятно, также эффективности. Когда вам нужен состав - переходите к этому решению.
Почему композиция не подходит для этой проблемы
Композиция подразумевает некоторые последствия:
- Составленные объекты не существуют сами по себе,
- Их связь с составным объектом постоянна в течение всего срока службы этого объекта.
В вашей модели данных у вас есть отдельное значение:
- Массив вершин (независимый),
- Массив ребер.
Возможно, оба размещены в стеке (но это не очень важно).
Тогда вы хотите, чтобы каждое ребро относилось к N вершинам.
Край НЕ владеет ими - он только относится к ним. Таким образом, ни композиция, ни интеллектуальный указатель (который предназначен для введения какой-либо ассоциации владения) здесь не то, что вам нужно, потому что дизайн говорит, что вершины принадлежат массиву вершин, а не ребрам .
Так что идите за простым указателем.
Вы можете даже использовать индексы массива вместо указателей в качестве альтернативы (которая действительно имеет свои применения, например, если вы хотите использовать последний массив в качестве буфера индекса для 3D-рендеринга). Все зависит от ваших потребностей.