Доступ к картам c ++ с использованием класса, отличного от индекса - PullRequest
1 голос
/ 27 марта 2011

Предположим, у вас есть класс:

class SomeClass{
   public:
      int x;
      SomeClass(){
         x = rand();
      }

      bool operator<(const SomeClass& rhs) const{
         return x < rhs.x;
      }

};

И тогда у вас есть это:

map<SomeClass, string> yeah;

Очевидно, это будет работать:

yeah[SomeClass()] = "woot";

Но есть лиспособ получить что-то вроде этого:

yeah[3] = "huh";

работает?Я имею в виду, что я пытался установить оператор <(int rhs) в дополнение к другому оператору, но без кубиков.Возможно ли это вообще? </p>

Ответы [ 3 ]

4 голосов
/ 27 марта 2011

Добавить конструктор:

SomeClass(int y){
    x = y;
}
3 голосов
/ 27 марта 2011
Оператор

map [] принимает только шаблонный класс в качестве своего параметра.Вместо этого вам нужен способ генерации определенного экземпляра вашего класса, который имеет значения, которые вы хотите.В этом примере добавьте конструктор, который позволит вам указать значение, которое должно иметь x.

class SomeClass{
   public:
      int x;
      SomeClass(){
         x = rand();
      }
      SomeClass(int a) : x(a){
      }

      bool operator<(const SomeClass& rhs) const{
         return x < rhs.x;
      }

};

И затем используйте

yeah[SomeClass(3)] = "huh";

Или вы можете просто использовать

yeah[3] = "huh";

, который делает то же самое, неявно вызывая конструктор SomeClass.

0 голосов
/ 27 марта 2011

Вы не можете использовать да [3] как , для этого потребуется карта для хранения ключей обоих типов: SomeClass и int ;Также учтите, что каждый раз, когда вы добавляете новый элемент на карту, «индексированная» позиция определенного элемента может изменяться, поскольку элементы всегда поддерживаются в порядке, заданном ключевым элементом.Если вам нужно посмотреть на определенный момент времени для элемента № j, вы можете использовать, вероятно, итератор на карте.

...