Использование сложного класса в качестве ключа в std::map
От: alexnik  
Дата: 18.05.12 09:26
Оценка:
У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне выгоднее использовать в качестве ключа указатель на структуру.
Насколько я понимаю по памяти я выиграю, по производительности — нет, по сложности написания проиграю. Скажите прав ли я? И как вы поступили бы в этом случае.
map stl
Re: Использование сложного класса в качестве ключа в std::map
От: rg45 СССР  
Дата: 18.05.12 10:01
Оценка:
Здравствуйте, alexnik, Вы писали:

A>У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне выгоднее использовать в качестве ключа указатель на структуру.

A>Насколько я понимаю по памяти я выиграю, по производительности — нет, по сложности написания проиграю. Скажите прав ли я? И как вы поступили бы в этом случае.

Все зависит от задачи, от используемых типов... На твой вопрос в таком общем виде ответить вряд ли получится, дай больше конкретики.
--
Справедливость выше закона. А человечность выше справедливости.
Re: Использование сложного класса в качестве ключа в std::map
От: MasterZiv СССР  
Дата: 18.05.12 10:54
Оценка:
On 05/18/2012 01:26 PM, alexnik wrote:

> У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне

> выгоднее использовать в качестве ключа указатель на структуру.

По памяти -- зависит от кол-ва элементов в словаре.
Стоит делать только для гигантских объёмов данных.

> Насколько я понимаю по памяти я выиграю,


Да.

по производительности — нет,

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

по
> сложности написания проиграю.

Если не будет словаря структур, то сложность практически
останется такой же.
Главная сложность -- писать operator <, а это надо делать
и так, и так.

Скажите прав ли я? И как вы поступили бы в этом
> случае.

Ну задачу надо целиком знать.

Вообще, если идёт речь о экономии именно места, можно
подумать о хранении в отсортированном векторе и бинарном
поиске по нему.
Posted via RSDN NNTP Server 2.1 beta
Re: Использование сложного класса в качестве ключа в std::map
От: LanOK  
Дата: 18.05.12 13:46
Оценка:
Здравствуйте, alexnik, Вы писали:

A>У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне выгоднее использовать в качестве ключа указатель на структуру.

A>Насколько я понимаю по памяти я выиграю, по производительности — нет, по сложности написания проиграю. Скажите прав ли я? И как вы поступили бы в этом случае.
Re[2]: Использование сложного класса в качестве ключа в std::map
От: LanOK  
Дата: 18.05.12 13:51
Оценка:
Здравствуйте, LanOK, Вы писали:

LOK>Здравствуйте, alexnik, Вы писали:


A>>У меня есть некоторый класс большой класс в качестве ключа мапа. Насколько мне выгоднее использовать в качестве ключа указатель на структуру.

A>>Насколько я понимаю по памяти я выиграю, по производительности — нет, по сложности написания проиграю. Скажите прав ли я? И как вы поступили бы в этом случае.

Что-то не то отправил.
Поидее вы выиграете на времени вставки.
Так что если критично время построения то возможно стоит воспользоваться указателями.
Re: Использование сложного класса в качестве ключа в std::map
От: Alexander Pazdnikov  
Дата: 01.06.12 06:47
Оценка:
Здравствуйте, 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
От: aset  
Дата: 01.06.12 21:01
Оценка:
Здравствуйте, 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;
...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.