Как проверить значения в карте C ++, не получая ошибок компилятора в функции-члене "const"? - PullRequest
2 голосов
/ 29 апреля 2011

У меня есть функция-член, которая сравнивает данные в карте C ++.Я объявил функцию-член как константу:

bool operator == (UnitSet otherSet) const;

, но как только я использую myMap ["l"] для доступа и сравнения значений, я получаю ошибки компилятора о том, что myMap является константой.Есть ли способ обойти это, сохранив директиву const?

Я знаю, что для ключа "l" создано пустое значение, если его не было, когда я проверял его, но это не изменит значение/ поведение моего UnitSet - может быть, я пытаюсь быть слишком разборчивым, и мне следует просто выбросить "const".Какой хороший способ пойти по этому поводу?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

Во-первых, вы должны изменить сигнатуру функции, чтобы она принимала otherSet по константной ссылке, поскольку вам не нужно копировать ее и не будете ее изменять:

bool operator==(const UnitSet& otherSet) const;

Тогда, вместо использования- const operator[], используйте find() или begin() / !=end() / ++, чтобы получить const_iterator s в map s для сравнения.Поскольку find(), begin() и операции с const_iterator требуют только const доступа к map, их можно использовать из вашей const функции-члена.

map<X, Y>::const_iterator i = the_map.find(key);
if (i != the_map.end())
    // here, i->first is the key, i->second is the value
else
    // key wasn't in the map after all...
3 голосов
/ 29 апреля 2011
К сожалению,

std::map не перегружен const оператором []. Это потому, что всякий раз, когда вы получаете доступ к ключу, который не существует, карта создает для него элемент; если бы карта была const, это было бы невозможно. Следовательно, нет возможности назвать его постоянной картой. Это не связано с поведением вашего UnitSet класса.

Вам нужно будет использовать myMap.find(TKey), чтобы получить итератор для вашего элемента, который возвращает myMap.end(), если он не может его найти.

Итераторы карты указывают на std::pair вашего ключа и значения, поэтому вам необходимо получить доступ к члену second, чтобы получить ваше значение (first является ключом).

const UnitSet& reference = myMap.find("l")->second;
...