2015-02-09 2 views
0

что у меня есть метод, как этотс помощью оператора [] с картой в константный метод

int someclass::somemethod(const std::string &name) const 
{ 
     std::string a = mymap["a"]; 
     ..... 
} 

где MyMap

std::map<std::string,std::string> 

Это ошибка я получаю

Error 1 error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<std::string, std::string> ' (or there is no acceptable conversion)  

Любые предложения о том, как я могу получить доступ к значению ключа? ?

+0

использовать карту :: найти, чтобы получить итератор элемента. – Beginner

+1

Это хорошая форма для записи [SSCCE] (http://www.sscce.org/), которая имеет пример объявления карты и доступа к карте. –

+0

Я знаю, что могу сделать это, однако по какой-то сумасшедшей причине карта возвращает end(), и я уверен, что элемент находится в контейнере. Вот почему я хотел использовать оператор [] – MistyD

ответ

6

Используйте функцию .find участника, чтобы выполнить поиск.

auto it = mymap.find("a"); 

if (it != mymap.end()) 
    // it->first = key, it->second = mapped value. 

Использование operator[] вместо find не сделает поисковую работу лучше. Либо совпадают ключи (в этом случае find будет работать нормально), либо нет (в этом случае [] пытается вставить новый узел с этим ключом, который будет связан со значением-инициализированным значением - пустая строка в этом случае.

это что последнее поведение (добавление нового узла), что означает, что нет const версии operator[].

Да, это было бы возможно определить operator[] таким образом, что работали с const контейнером , например, если вы выбрали исключение, если/если запрошенный ключ отсутствовал, но он не определен, чтобы работать таким образом сейчас, и , вероятно, тоже скоро не будет.

5

std::map::operator[] имеет (злой (!?)) Непостоянный побочный эффект. Оператор добавляет новый элемент, если этот элемент еще не существует. somemethod() объявлен как const, поэтому std::map также является const и не может быть изменен. Следовательно, непостоянный operator[] не может быть применен к const std::map. Альтернативами являются std::map::find() и std::map::at() (C++ 11).

+0

'std :: map :: at()' тоже может быть хорошей альтернативой. – juanchopanza

+0

@juanchopanza: да, но только в C++ 11 и более поздних версиях. В любом случае 'find()' возвращает интернатор, что позволяет легко проверить, существует ли этот элемент или нет. Но 'at()' выбрасывает 'std :: out_of_range', если элементы не существуют. –

+0

@RemyLebeau Это один до настоящего стандарта. Мы в 2015 году ;-) – juanchopanza

Смежные вопросы