ламерский вопрос по std::map
От: Аноним  
Дата: 08.05.05 11:09
Оценка:
есть std::map<int[3], CMyClass>
как можно добавить определенную пару key-value? "int c[3]; MyMap[c] = MyValue;" естественно не работает
Re: ламерский вопрос по std::map
От: HiSH Россия http://m0riarty.ya.ru
Дата: 08.05.05 11:34
Оценка:
Здравствуйте, Аноним

Попробовать сделать map<int*, CMyClass>? К сожалению проверить негде.
Одно НО: при таком добавлении, как у тебя приведено, после выхода c[] за пределы видимости в MyMap будет содержаться лабуда (ты реально в него добавляешь всего лишь указатель на int). Выход — использовать std::vector:

  std::map<std::vector<int> CMyClass> MyMap;

  void foo(){
    std::vector<int> key;
    MyMap[key] = value;
  }


ЗЫ. Возможно компилер не скушает std::map<std::vector<int>, тогда std::vector<int> надо объявить тайпдефом

Вы писали:

А>есть std::map<int[3], CMyClass>

А>как можно добавить определенную пару key-value? "int c[3]; MyMap[c] = MyValue;" естественно не работает
Re: ламерский вопрос по std::map
От: lastique  
Дата: 08.05.05 12:12
Оценка: +3
Здравствуйте, Аноним, Вы писали:

А>есть std::map<int[3], CMyClass>

А>как можно добавить определенную пару key-value? "int c[3]; MyMap[c] = MyValue;" естественно не работает

Я бы сделал так:

struct MyKey {
  int val[3];
};

std::map<MyKey, CMyClass> MyMap;

MyKey key;
CMyClass value;

MyMap[key] = value;


Заодно для MyKey можно определить правила сравнения и конструктор (если таковой требуется).
Re: ламерский вопрос по std::map
От: _DAle_ Беларусь  
Дата: 08.05.05 12:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>есть std::map<int[3], CMyClass>

А>как можно добавить определенную пару key-value? "int c[3]; MyMap[c] = MyValue;" естественно не работает

Элемент этого map имеет тип std::pair<int[3], CMyClass>, а ни конструктора, ни оператора присваивания по умолчанию для int[3] нет, поэтому у std::pair<int[3], CMyClass> тоже их нет.
Используй std::map<std::vector<int>, CMyClass>
Re: ламерский вопрос по std::map
От: AvDav Армения  
Дата: 08.05.05 13:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>есть std::map<int[3], CMyClass>

А>как можно добавить определенную пару key-value? "int c[3]; MyMap[c] = MyValue;" естественно не работает

А можно спросить — зачем?
Если вопрос чисто теоретический то лучше конечно через стд::вектор<инт> и передоставить свой вариант для стд::лесс<стд::вектор<инт> > который по умолчанию вызывает стд::лексографикал_компаре() — то есть как только слева на право читая елементы найдет а < б то тру. Вообщем надо определить сравнение ключей.
П.С. Вам действительно необходимо идентифицировать обьекты CMyClass-а с помощью 3-х инт-ов ???
Re[2]: ламерский вопрос по std::map
От: Аноним  
Дата: 08.05.05 14:49
Оценка:
Здравствуйте, AvDav, Вы писали:

AD>П.С. Вам действительно необходимо идентифицировать обьекты CMyClass-а с помощью 3-х инт-ов ???


Наверное это какие-нибудь координаты.
В общем действительно лучше завести отдельную структуру для таких вещей.
Re[2]: ламерский вопрос по std::map
От: Кодёнок  
Дата: 10.05.05 11:50
Оценка:
А>>есть std::map<int[3], CMyClass>
А>>как можно добавить определенную пару key-value? "int c[3]; MyMap
 = MyValue;" естественно не работает

AD>А можно спросить - зачем?
AD>П.С. Вам действительно необходимо идентифицировать обьекты CMyClass-а с помощью 3-х инт-ов ???

Довольно редко такое нужно, например, typedef BYTE Guid[16] или матрица фиксированных размеров typedef double SimpleFilter[5][5].

Почти всегда это решается через какую-нибудь надстройку вроде 
[c]
template <class T, int w, int h> class StaticArray;


или через объявление структуры.

Имхо это упущение языка, т.к.
int a[3], b[3];
a = b; // не компилируется

struct { int v[3]; } c, d;
c = d; // компилируется


Раз уж оператор присваивания по умолчанию умеет копировать массивы, то и типы Guid или SimpleFilter тоже вполне могли бы присваиваться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.