Доступ карты C++ отбрасывает спецификаторы (константа)

((?!).)* будет проверять, что этот конкретный символ, который будет согласован, не должен быть начальным символом в строке . Если да, то только он соответствует этому конкретному символу. * повторяет то же самое ноль или более раз.

(.(?!))* соответствует любому символу, только если за ним не следует , ноль или более раз. Таким образом, это будет соответствовать всем символам внутри тега таблицы excpet последнего символа, так как за последним символом следует . И следующий шаблон утверждает, что в конце матча должен быть тег закрывающей таблицы. Это приводит к сбою совпадения.

См. здесь

105
задан cdleary 4 November 2008 в 21:45
поделиться

4 ответа

std::map operator [] не объявляется как const и не может произойти из-за его поведения:

T& оператор [] (константа Key& ключ)

Возвраты ссылка на значение, которое отображается на ключевом эквиваленте ключу, выполняя вставку, если такой ключ уже не существует.

В результате Ваша функция не может быть объявлена const и использовать функцию карты operator[].

std::map find() , позволяет Вам искать ключ, не изменяя карту.

find() возвраты iterator, или const_iterator к std::pair содержащий и ключ (.first) и значение (.second).

В C++ 11, Вы могли также использовать at() для [1 114]. Если элемент не существует, функция бросает std::out_of_range исключение, в отличие от [1 116].

145
ответ дан oɔɯǝɹ 5 November 2019 в 10:58
поделиться

Вы не можете использовать operator[] на карте, которая является const, поскольку тот метод не const, поскольку он позволяет Вам изменять карту (можно присвоить _map[key]). Попытайтесь использовать find метод вместо этого.

10
ответ дан sg7 5 November 2019 в 10:58
поделиться

Некоторые более новые версии заголовков GCC (4.1 и 4.2 на моей машине) имеют нестандартную карту функций членства:: в (), которые объявляются константой и бросают станд.:: out_of_range, если ключ не находится в карте.

const mapped_type& at(const key_type& __k) const

Из ссылки в комментарии функции, кажется, что это было предложено в качестве новой функции членства в стандартной библиотеке.

7
ответ дан Nathan Kitchen 5 November 2019 в 10:58
поделиться

Во-первых, вы не должны использовать символы, начинающиеся с _, потому что они зарезервированы для реализации языка / средства записи компилятора. Было бы очень легко, если бы _map стал синтаксической ошибкой в ​​чьем-то компиляторе, и вам было бы некого винить, кроме себя.

Если вы хотите использовать подчеркивание, ставьте его в конце, а не в начале. Вы, вероятно, сделали эту ошибку, потому что видели, как это делает код Microsoft. Помните, что они пишут свой собственный компилятор, так что им это может сойти с рук. Тем не менее, это плохая идея.

оператор [] не только возвращает ссылку, он фактически создает запись на карте. Таким образом, вы не просто получаете отображение, если его нет, вы его создаете. Это не то, что вы хотели.

0
ответ дан 24 November 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: