Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
#1

Составной ключ для std::map - C++

18.11.2012, 20:02. Просмотров 771. Ответов 4
Метки нет (Все метки)

Есть класс. Нужно его сделать ключем для карты.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Vertex{
public:
    double X,Y,Z;
    Vertex(double x=0,double y=0, double z=0){X=x;Y=y;Z=z;}
    void Set(double x,double y,double z){X=x;Y=y;Z=z;}
    void print(){printf("X=%f, Y=%f, Z=%f\n",X,Y,Z);}
    double L(){return Sqrt((X*X)+(Y*Y)+(Z*Z));}
    double L(Vertex A){return Sqrt((X*X-2*X*A.X+A.X*A.X)+(Y*Y-2*Y*A.Y+A.Y*A.Y)+(Z*Z-2*Z*A.Z+A.Z*A.Z));}
    bool operator  <(double A){return (X<A && Y<A && Z<A);}
    bool operator  >(double A){return (X>A && Y>A && Z>A);}
    bool operator ==(Vertex A){return (X==A.X && Y==A.Y && Z==A.Z);}
    bool operator  <(Vertex A){return std::tie(X, Y, Z) < std::tie(A.X, A.Y, A.Z);}
    bool operator ==(double A){return (X==A && Y==A && Z==A);}
    bool operator !=(double A){return (X!=A || Y!=A || Z!=A);}
    bool operator !=(Vertex A){return (X!=A.X || Y!=A.Y || Z!=A.Z);}
    void operator +=(Vertex A){X+=A.X;Y+=A.Y;Z+=A.Z;}
    void operator +=(double A){X+=A;Y+=A;Z+=A;}
    void operator *=(Vertex A){X*=A.X;Y*=A.Y;Z*=A.Z;}
    void operator *=(double A){X*=A;Y*=A;Z*=A;}
    void operator /=(double A){X/=A;Y/=A;Z/=A;}
    void operator -=(Vertex A){X-=A.X;Y-=A.Y;Z-=A.Z;}
    void operator  =(double A){X=A;Y=A;Z=A;}
    Vertex operator *(double A){return Vertex(X*A,Y*A,Z*A);}
    Vertex operator -(Vertex A){return Vertex(X-A.X,Y-A.Y,Z-A.Z);}
    Vertex operator +(Vertex A){Vertex Res=*this;Res+=A;return Res;}
    double GetA(){return X/L();}
    double GetB(){return Y/L();}
    double GetC(){return Z/L();}
    bool Null(){if(X==0 && Y==0 && Z==0)return 1;return 0;}
    Vertex Normalize(){double l=Sqrt((X)*(X)+(Y)*(Y)+(Z)*(Z));X/=l;Y/=l;Z/=l;return *this;}
};
int main(){
    Vertex A;
    std::map<Vertex,int> C;
    C[A]=231;
}
вот лог ошибок.
In file included from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/string:50:0,
from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/bits/locale_classes.h:42,
from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/bits/ios_base.h:43,
from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/ios:43,
from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/istream:40,
from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/fstream:40,
from Collision.h:10,
from Actor.h:5,
from main.cpp:12:
/usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/bits/stl_function.h: In instantiation of «bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Vertex]»:
/usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/bits/stl_map.h:471:2: required from «std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = Vertex; _Tp = std::basic_string<char>; _Compare = std::less<Vertex>; _Alloc = std::allocator<std:air<const Vertex, std::basic_string<char> > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::basic_string<char>; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = Vertex]»
Collision.h:610:19: required from here
/usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/bits/stl_function.h:237:22: ошибка: passing «const Vertex» as «this» argument of «bool Vertex::operator<(Vertex)» discards qualifiers [-fpermissive]

Заранее спасибо за ответы.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2012, 20:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Составной ключ для std::map (C++):

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map? - C++
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std map? Например: std::map...

Emplace в std::map. Как добавить элемент в std::map без копирования? - C++
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa; ksa.emplace(std::piecewise_construct, ...

std::map find. Получить ключ(элемент) и как записать все данные при объявлений? - C++
Вопрос первый: как получить ключ контейнера map по данным? например: // id, name std::map&lt;int, string&gt; BookMap; BookMap bookmap; ...

std::map, std::vector и порядок обхода коллекции - C++
Здравствуйте, уважаемые! Вопрос следующий - если я сохраняю какие-то значения в map или вектор, то всегда ли я буду получать тот-же...

Стоит ли очищать в деструкторе std::map , std::vecotor? - C++
У меня ещё один нубский вопрос :) Вот если в классе объявлены мапы и вектора, которые по ходу программы как то заполняются, нужно ли мне...

Потокобезопасность std::map::end, std::list::end - C++
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) // != list.end() {...} myIter =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.11.2012, 20:08 #2
операторы отношения изменяют состояние класса?
нет
тогда почему какого дьявола они не константные?
0
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
18.11.2012, 20:15  [ТС] #3
Jupiter, та-же фигня, что и была.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Vertex{
public:
    double X,Y,Z;
    Vertex(double x=0,double y=0, double z=0){X=x;Y=y;Z=z;}
    void Set(double x,double y,double z){X=x;Y=y;Z=z;}
    void print(){printf("X=%f, Y=%f, Z=%f\n",X,Y,Z);}
    double L(){return Sqrt((X*X)+(Y*Y)+(Z*Z));}
    double L(Vertex A){return Sqrt((X*X-2*X*A.X+A.X*A.X)+(Y*Y-2*Y*A.Y+A.Y*A.Y)+(Z*Z-2*Z*A.Z+A.Z*A.Z));}
    const bool operator  <(double A){return (X<A && Y<A && Z<A);}
    const bool operator  >(double A){return (X>A && Y>A && Z>A);}
    const bool operator ==(Vertex A){return (X==A.X && Y==A.Y && Z==A.Z);}
    const bool operator  <(Vertex A){return std::tie(X, Y, Z) < std::tie(A.X, A.Y, A.Z);}
    const bool operator ==(double A){return (X==A && Y==A && Z==A);}
    const bool operator !=(double A){return (X!=A || Y!=A || Z!=A);}
    const bool operator !=(Vertex A){return (X!=A.X || Y!=A.Y || Z!=A.Z);}
    void operator +=(Vertex A){X+=A.X;Y+=A.Y;Z+=A.Z;}
    void operator +=(double A){X+=A;Y+=A;Z+=A;}
    void operator *=(Vertex A){X*=A.X;Y*=A.Y;Z*=A.Z;}
    void operator *=(double A){X*=A;Y*=A;Z*=A;}
    void operator /=(double A){X/=A;Y/=A;Z/=A;}
    void operator -=(Vertex A){X-=A.X;Y-=A.Y;Z-=A.Z;}
    void operator  =(double A){X=A;Y=A;Z=A;}
    Vertex operator *(double A){return Vertex(X*A,Y*A,Z*A);}
    Vertex operator -(Vertex A){return Vertex(X-A.X,Y-A.Y,Z-A.Z);}
    Vertex operator +(Vertex A){Vertex Res=*this;Res+=A;return Res;}
    double GetA(){return X/L();}
    double GetB(){return Y/L();}
    double GetC(){return Z/L();}
    bool Null(){if(X==0 && Y==0 && Z==0)return 1;return 0;}
    Vertex Normalize(){double l=Sqrt((X)*(X)+(Y)*(Y)+(Z)*(Z));X/=l;Y/=l;Z/=l;return *this;}
};
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.11.2012, 20:17 #4
Invader_Zim, добавленные вами const никаким образом не относятся к проблеме, указанной Jupiter-ом.
0
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
18.11.2012, 20:20  [ТС] #5
все, решил.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2012, 20:20
Привет! Вот еще темы с ответами:

std::map не компилируется - C++
Всем здравствуйте. Возникла проблема при попытке использования std::map в visual studio 2010. при подключении файла &lt;map&gt; и объявлении...

Особенности std::map - C++
Добрый день форумчане, хотел спросить такую вещь, сейчас занимаюсь оптимизацией в графическом движке и возникла такая проблемма, хочу...

allocator std::map - C++
Подскажите вопрос, есть тестовое задание: Подскажите где про это почитать и разъясните по-возможности, что это вообще такое...

Размерность std::map - C++
Добрый вечер. Использую тип данных 16 байтовый. Надо записать несколько десятков миллионов расчетов в map &lt;type, type&gt; val; C...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.11.2012, 20:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru