создание указателя на вектор в классе

#c #vector

#c #вектор

Вопрос:

Я создаю программное обеспечение САПР, в котором у меня есть точка класса и строка класса.

 #include <vector>
using namespace std;
class point
{
private:
    vector<int>* child;
    int id;//this is unique id of a point
    double x;//absolute x, y, z co-ord
    double y;//
    double z;//
};

class line
{
private:
    point *a;
    point *b;
    int id;//this is unique for each line object
}
  

любой линейный объект является дочерним для 2 точечных объектов.
итак, если я удалю точку линии, тогда объект line также будет удален.
Для этого я хочу сохранить идентификатор всех дочерних элементов (линия, круг, треугольник, ….) точечного объекта в дочернем элементе вектора (переменная экземпляра класса point, как показано в коде).

мой вопрос в том, правильный ли мой подход? я имею в виду, что в выполнении будет около 100 точечных объектов. поскольку каждый вектор выделяет некоторую дополнительную память, будет много выделенной памяти, которая не будет использоваться при выполнении. может ли кто-нибудь предложить альтернативный способ хранения неизвестного номера int в виде последовательности в каждом точечном объекте?

Комментарии:

1. Я не понимаю, что вы пытаетесь сделать. Однако, чтобы использовать vector, вам нужно сначала «#include <vector>», а затем где-то написать «используя пространство имен std;»

2. @SalvatorePreviti никогда не делайте using namespace x этого в заголовочном файле в глобальной области видимости.

3. Да, верно 🙂 я согласен, извините. Он должен выполнить std::vector<int>

4. Возможно, вы спрашиваете нас о концепции подсчета ссылок? Я все еще не понимаю вопроса.

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

Ответ №1:

Вам не нужно использовать указатель на вектор, для этого подойдет объект:

 #include <vector>
class point
{
private:
   std::vector<int> child;
   int id;//this is unique id of a point
   double x;//absolute x, y, z co-ord
   double y;//
   double z;//
};
  

Не забудьте включить <vector> и квалифицировать ваше использование std::vector .

Ответ №2:

мой вопрос в том, как мне создать этот вектор и где (чтобы он не выходил за рамки)?

Вы уже сделали это правильно. Я бы предположил, что вы не используете указатель на свой vector , а просто vector сам:

 private:
    vector<int> child;
  

Это значительно упрощает его обработку, и вам не нужно выделять / освобождать его самостоятельно.


как мне заставить моего дочернего элемента указывать на созданный вектор без утечки памяти?

Если вам действительно нужен динамически выделяемый указатель, вы должны вызвать new и delete . Чтобы это работало правильно, вы должны определить как конструктор, так и деструктор в вашем point классе:

 class point
{
private:
    point() : child(new vector<int>) {}
    ~point() { delete child; }

    vector<int>* child;
    int id;//this is unique id of a point
    double x;//absolute x, y, z co-ord
    double y;//
    double z;//
};
  

Но я все же рекомендую вам не использовать указатель на a vector , как я объяснил выше.

Комментарии:

1. можете ли вы предложить какую-либо альтернативу для векторов; потому что во время выполнения программы будет много потерь памяти

2. vectors обычно они имеют небольшие накладные расходы на память и обычно довольно эффективны, если вы не вставляете / не удаляете много элементов.

3. предположим, что каждый вектор имеет 32 байта избыточной памяти, тогда 100 * 32 = 3200 байт пустой памяти для одного класса…. аналогично существует около 30 других классов… сколько памяти будет потрачено впустую!!!

4. @CAD_coding: проверить ускорение array

5. @CAD_coding: вы действительно нацелены на такое устройство с низким объемом памяти, что стоит приложить усилия для сохранения нескольких килобайт? Если это так, вы должны упомянуть об этом в вопросе. Если нет, то не беспокойтесь о накладных расходах на использование vector .

Ответ №3:

Я бы решил проблему совершенно по-другому.

Я бы сохранил две глобальные хэш-таблицы по идентификатору: одну для точек и одну для строк. Тогда я бы использовал двусвязную структуру данных списка для каждой точки, чтобы вы знали, сколько строк использует данную точку.

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

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