У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне выгоднее использовать в качестве ключа указатель на структуру.
Насколько я понимаю по памяти я выиграю, по производительности — нет, по сложности написания проиграю. Скажите прав ли я? И как вы поступили бы в этом случае.
Здравствуйте, alexnik, Вы писали:
A>У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне выгоднее использовать в качестве ключа указатель на структуру. A>Насколько я понимаю по памяти я выиграю, по производительности — нет, по сложности написания проиграю. Скажите прав ли я? И как вы поступили бы в этом случае.
Все зависит от задачи, от используемых типов... На твой вопрос в таком общем виде ответить вряд ли получится, дай больше конкретики.
--
Справедливость выше закона. А человечность выше справедливости.
Re: Использование сложного класса в качестве ключа в std::map
On 05/18/2012 01:26 PM, alexnik wrote:
> У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне > выгоднее использовать в качестве ключа указатель на структуру.
По памяти -- зависит от кол-ва элементов в словаре.
Стоит делать только для гигантских объёмов данных.
> Насколько я понимаю по памяти я выиграю,
Да.
по производительности — нет,
останется такой же практически, если у тебя нет возможности
сравнивать адреса вместо самих структур (т.е. из структур ты
выстроиш словарь наподоби атомов или символов лиспа).
по > сложности написания проиграю.
Если не будет словаря структур, то сложность практически
останется такой же.
Главная сложность -- писать operator <, а это надо делать
и так, и так.
Скажите прав ли я? И как вы поступили бы в этом > случае.
Ну задачу надо целиком знать.
Вообще, если идёт речь о экономии именно места, можно
подумать о хранении в отсортированном векторе и бинарном
поиске по нему.
Posted via RSDN NNTP Server 2.1 beta
Re: Использование сложного класса в качестве ключа в std::map
Здравствуйте, alexnik, Вы писали:
A>У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне выгоднее использовать в качестве ключа указатель на структуру. A>Насколько я понимаю по памяти я выиграю, по производительности — нет, по сложности написания проиграю. Скажите прав ли я? И как вы поступили бы в этом случае.
Re[2]: Использование сложного класса в качестве ключа в std::map
Здравствуйте, LanOK, Вы писали:
LOK>Здравствуйте, alexnik, Вы писали:
A>>У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне выгоднее использовать в качестве ключа указатель на структуру. A>>Насколько я понимаю по памяти я выиграю, по производительности — нет, по сложности написания проиграю. Скажите прав ли я? И как вы поступили бы в этом случае.
Что-то не то отправил.
Поидее вы выиграете на времени вставки.
Так что если критично время построения то возможно стоит воспользоваться указателями.
Re: Использование сложного класса в качестве ключа в std::map
Здравствуйте, alexnik, Вы писали:
A>У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне выгоднее использовать в качестве ключа указатель на структуру. A>Насколько я понимаю по памяти я выиграю, по производительности — нет, по сложности написания проиграю. Скажите прав ли я? И как вы поступили бы в этом случае.
Возможно, будет умеснто воспользоваться обёрткой, а стратегию подобрать экспериментально.
struct BigClass
{
REAL_KEY_TYPE id(){ /* стратегия получения ид. объекта; это может быть в том числе просто указатель на объект, ключ для объекта */}
};
struct BigClassKey
{
BigClassKey(const BigClass &o) :
m_id(o.id())
{}
bool operator== (const BigClassKey &o) {}
private:
REAL_KEY_TYPE m_id;
};
Re: Использование сложного класса в качестве ключа в std::map
Здравствуйте, alexnik, Вы писали:
A>У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне выгоднее использовать в качестве ключа указатель на структуру. A>Насколько я понимаю по памяти я выиграю, по производительности — нет, по сложности написания проиграю. Скажите прав ли я? И как вы поступили бы в этом случае.
А что такое производительность в контексте вашей программы? Акцент на вставках/удалениях или частом доступе?
Очевидно, что указатель в качестве ключа будет работать до тех пор, пока сам ключ не скопируют в другую область памяти.
boost::shared_ptr в программе можно использовать? если да, то можно, например, сделать так (тривиальный вариант):
#include <boost/shared_ptr.hpp>
#include <iostream>
#include <map>
struct Large
{
Large(int _id):id(_id) {}
int id;
... // Large data
};
typedef boost::shared_ptr<Large> LargePtr;
bool operator < (const LargePtr& rhs, const LargePtr& lhs)
{
return rhs->id < lhs->id; // for example
}
...
std::map<LargePtr, SomeValueType> l2v;
...