((?!).)*
будет проверять, что этот конкретный символ, который будет согласован, не должен быть начальным символом в строке . Если да, то только он соответствует этому конкретному символу.
*
повторяет то же самое ноль или более раз.
(.(?!))*
соответствует любому символу, только если за ним не следует , ноль или более раз. Таким образом, это будет соответствовать всем символам внутри тега таблицы excpet последнего символа, так как за последним символом следует
. И следующий шаблон
утверждает, что в конце матча должен быть тег закрывающей таблицы. Это приводит к сбою совпадения.
См. здесь
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].
Вы не можете использовать operator[]
на карте, которая является const
, поскольку тот метод не const
, поскольку он позволяет Вам изменять карту (можно присвоить _map[key]
). Попытайтесь использовать find
метод вместо этого.
Некоторые более новые версии заголовков GCC (4.1 и 4.2 на моей машине) имеют нестандартную карту функций членства:: в (), которые объявляются константой и бросают станд.:: out_of_range, если ключ не находится в карте.
const mapped_type& at(const key_type& __k) const
Из ссылки в комментарии функции, кажется, что это было предложено в качестве новой функции членства в стандартной библиотеке.
Во-первых, вы не должны использовать символы, начинающиеся с _, потому что они зарезервированы для реализации языка / средства записи компилятора. Было бы очень легко, если бы _map стал синтаксической ошибкой в чьем-то компиляторе, и вам было бы некого винить, кроме себя.
Если вы хотите использовать подчеркивание, ставьте его в конце, а не в начале. Вы, вероятно, сделали эту ошибку, потому что видели, как это делает код Microsoft. Помните, что они пишут свой собственный компилятор, так что им это может сойти с рук. Тем не менее, это плохая идея.
оператор [] не только возвращает ссылку, он фактически создает запись на карте. Таким образом, вы не просто получаете отображение, если его нет, вы его создаете. Это не то, что вы хотели.