Хранение списка объектов

Перейдите по этим ссылкам для описаний MSDN:

  • Math.Floor , который округляет в меньшую сторону к отрицательной бесконечности.
  • Math.Ceiling , который окружает к положительной бесконечности.
  • Math.Truncate , который окружает или вниз по направлению к нулю.
  • Math.Round , который округляется к ближайшему целому числу или конкретному количеству десятичных разрядов. Можно указать поведение, если это является точно равноотстоящим между двумя возможностями, таким как округление так, чтобы заключительная цифра была даже (" Round(2.5,MidpointRounding.ToEven)" становление 2) или так, чтобы это было еще дальше от нуля (" Round(2.5,MidpointRounding.AwayFromZero)" становление 3).

следующая схема и таблица могут помочь:

-3        -2        -1         0         1         2         3
 +--|------+---------+----|----+--|------+----|----+-------|-+
    a                     b       c           d            e

                       a=-2.7  b=-0.5  c=0.3  d=1.5  e=2.8
                       ======  ======  =====  =====  =====
Floor                    -3      -1      0      1      2
Ceiling                  -2       0      1      2      3
Truncate                 -2       0      0      1      2
Round (ToEven)           -3       0      0      2      3
Round (AwayFromZero)     -3      -1      0      2      3

Примечание, которое Round намного более мощно, чем он, кажется, просто потому что это может вокруг к определенному количеству десятичных разрядов. Все другие вокруг для обнуления десятичных чисел всегда. Например:

n = 3.145;
a = System.Math.Round (n, 2, MidpointRounding.ToEven);       // 3.14
b = System.Math.Round (n, 2, MidpointRounding.AwayFromZero); // 3.15

С другими функциями, необходимо использовать, умножаются/делят обман для достижения того же эффекта:

c = System.Math.Truncate (n * 100) / 100;                    // 3.14
d = System.Math.Ceiling (n * 100) / 100;                     // 3.15

5
задан 1800 INFORMATION 21 August 2009 в 03:13
поделиться

5 ответов

EDIT: As mentioned in a comment boost::ptr_list is even better since it is more efficient and has the same net effect as a std::list >.


EDIT: Вы упомянули, что используете Qt в своем комментарии. Если вы используете> = 4.5, вы можете использовать классы Qt QList и QSharedPointer следующим образом:

QList<QSharedPointer<Object> > object_list;
object_list.push_back(QSharedPointer<Object>(new Object));

Я бы рекомендовал вам использовать std :: list <> . Вы также, вероятно, просто хотите сохранить указатели на объекты, чтобы они не копировались все время.

Итак, итоговая строка:

Допустим, у вас есть класс с именем Object . Вы должны сделать следующее:

std::list<boost::shared_ptr<Object> > object_list;
object_list.push_back(new Object);

Для c ++ 11/14, нет необходимости в повышении, просто используйте стандартные интеллектуальные указатели:

std::list<std::shared_ptr<Object>> object_list;
object_list.push_back(std::make_shared<Object>());

При использовании общих указателей объекты будут очищаться автоматически, когда они удаляются из списка (если нет других shared_ptr S, также указывающих на него).

У вас может быть список . Но учитывая ваш уровень опыта, List and delete them from the list when I'm done with them, no?

Yes, this is a viable option, but I highly recommend smart pointers to avoid the "...and delete them from the list..." step entirely.


NOTE:

also the example code you gave:

Object *obj = new Object;
myObjectList.append(*obj);

is probably not what you wanted, this makes a new object on the heap, they puts a copy of that in the list. If there is no delete obj after that, then you have a memory leak since raw pointers are not automatically deleted.

5
ответ дан 13 December 2019 в 05:39
поделиться

In the first case the Object is copied and only the original is destroyed. The other instance is kept in the list.

In the second version you can use the List destructor to delete the stored objects.

3
ответ дан 13 December 2019 в 05:39
поделиться

поскольку на «все» нет единого ответа - дьявол скрывает детали того, что вы хотите делать, или ваши ограничения.

Если объекты легкие и не требуют глубокого копирования, будет более эффективно хранить мелкие вещи в виде копий. В противном случае накладные расходы на умные указатели превышают допустимые. Если вы являетесь polymorPHic, вы можете использовать шаблонные списки.

если важнее минимизировать копирование,

2
ответ дан 13 December 2019 в 05:39
поделиться

Используйте указатели, как было предложено. Вы используете «общие» объекты, вероятно, базовый класс, и список фактически будет содержать некоторые производные объекты, приведенные к базовому типу - это означает, что вы должны передать указатель на первоначально созданный объект. В противном случае вы отбросите весь полиморфизм.

То есть

class Base 
{ 
public:
    int x; 
    virtual int getData() const { return x; }
};
class Derived : public Base 
{ 
public:
    int y; 
    virtual int getData() const { return y; }
};

Derived obj1;
obj1.x = 1;
obj1.y = 2;

Base obj2 = obj1;
cout << obj2.getData();

Будет выведено 1, поскольку obj2 - это просто копия базовой части obj1 и на самом деле является экземпляром Base.

1
ответ дан 13 December 2019 в 05:39
поделиться

Вы можете использовать List, а затем, когда придет время освободить объект в позиции x, вы должны использовать что-то вроде

void erase_object(list* l, int i) {
    delete (*list)[x]
    list -> removeObj((*list)[x]);
}
1
ответ дан 13 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: