#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:
Я бы решил проблему совершенно по-другому.
Я бы сохранил две глобальные хэш-таблицы по идентификатору: одну для точек и одну для строк. Тогда я бы использовал двусвязную структуру данных списка для каждой точки, чтобы вы знали, сколько строк использует данную точку.
Я бы упростил доступ к этой структуре данных с помощью простых операций в глобальном классе контейнера.
Я попытаюсь написать какой-нибудь «псевдо» код, чтобы сделать его более понятным (редактирование в ближайшее время).