В настоящее время я «модернизирую» свой код игрушечного компилятора, чтобы использовать как можно больше функций C++11 и научиться писать на современном C++. Просматривая свой код в поисках вещей, которые можно модернизировать, я нашел эту конструкцию:
for (size_t i = 0; i < _vector.size(); i++) {
for (size_t j = 0; j < _vector[i].length(); j++) {
_vector — это std::vector, содержащий исходный код файла, который необходимо скомпилировать. Каждый std::string в векторе представляет собой строку кода, которую необходимо скомпилировать. Перед компиляцией компилятор проверяет, есть ли в компилируемом коде какие-либо синтаксические ошибки, и первым шагом этой проверки является поиск пропущенных точек с запятой. Я делаю это, просматривая каждый символ один за другим и проверяя, является ли указанный символ точкой с запятой. Если да, я проверяю, нужна ли точка с запятой, строя своего рода мини-синтаксическое дерево и тем самым определяя, нужна ли она. В настоящее время я получаю доступ к каждому символу с помощью _vector[j], который очень напоминает ANSI-C (именно так вы получаете доступ к каждому символу в массиве char*), и я хочу заменить это итераторами. Насколько я знаю, итератор — это конструкция, подобная указателю, которая указывает на элемент в контейнере/последовательности/что угодно. Применяя аналогию с указателем, я пришел к выводу, что std::vector::iterator указывает на строку в векторе, поэтому теоретический std::vector::iterator: :iterator будет указывать на один символ в строковом объекте. Но поскольку в STL такого нет, аналогия с указателем здесь бесполезна. Итак, мой вопрос: как мне получить доступ к каждому символу внутри std::vector::iterator?
В настоящее время я «модернизирую» свой код игрушечного компилятора, чтобы использовать как можно больше функций C++11 и научиться писать на современном C++. Просматривая свой код в поисках вещей, которые можно модернизировать, я нашел эту конструкцию:
[code]for (size_t i = 0; i < _vector.size(); i++) { for (size_t j = 0; j < _vector[i].length(); j++) { [/code]
_vector — это std::vector, содержащий исходный код файла, который необходимо скомпилировать. Каждый std::string в векторе представляет собой строку кода, которую необходимо скомпилировать. Перед компиляцией компилятор проверяет, есть ли в компилируемом коде какие-либо синтаксические ошибки, и первым шагом этой проверки является поиск пропущенных точек с запятой. Я делаю это, просматривая каждый символ один за другим и проверяя, является ли указанный символ точкой с запятой. Если да, я проверяю, нужна ли точка с запятой, строя своего рода мини-синтаксическое дерево и тем самым определяя, нужна ли она. В настоящее время я получаю доступ к каждому символу с помощью _vector[i][j], который очень напоминает ANSI-C (именно так вы получаете доступ к каждому символу в массиве char*), и я хочу заменить это итераторами. Насколько я знаю, итератор — это конструкция, подобная указателю, которая указывает на элемент в контейнере/последовательности/что угодно. Применяя аналогию с указателем, я пришел к выводу, что std::vector::iterator указывает на строку в векторе, поэтому теоретический std::vector::iterator: :iterator будет указывать на один символ в строковом объекте. Но поскольку в STL такого нет, аналогия с указателем здесь бесполезна. Итак, мой вопрос: как мне получить доступ к каждому символу внутри std::vector::iterator?