Вот исходный код:
#include "stdafx.h"
#include <string>
#include <Windows.h>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
std::string P, R;
cin >> P >> R;
vector<char> PMassive(P.begin(), P.end());
vector<char> RMassive(R.begin(), R.end());
int counter = 0;
int counter2 = R.length();
metka:
int counter3 = P.length();
if (counter2 == 0) goto end;
if (PMassive[counter3] == RMassive[counter2]) {
counter2--;
counter3--;
}
else if (counter2 != 0) { counter++; goto metka; }
end:
std::cout << counter;
Sleep(5000);
return 0;
}
Выдает ошибку vector subscript out of range: http://snap.ashampoo.com/biLxWrF4 Проблема в (PMassive[counter3] == RMassive[counter2]). Что мне сделать, чтобы ее исправить?
Потому что массивы в C++ индексируются не от 1 до длины, а от 0 до (длины − 1).
А вы начинаете итерацию с индекса P.length(), который равен длине.
При работе с контейнером std::string P вам разрешается обращаться к элементам с индексами в диапазоне [ 0, P.length() ]. Основное содержимое строки будет располагаться по индексам от 0 до P.length() - 1, а последний элемент - с индексом P.length() - будет вести себя как нулевой терминатор, следующий сразу за основным содержимым строки.
Однако этот нулевой терминатор не считается собственной частью строки и в диапазон итераторов [ P.begin(), P.end() ) он не входит. Поэтому если вы решили скопировать содержимое строки в другой контейнер - вектор - через
vector<char> PMassive(P.begin(), P.end());
то в этом векторе P вам уже не разрешается доступаться к элементу с индексом P.length(). Такого элемента не существует. Разрешенные индексы для такого вектора лежат в диапазоне [ 0, P.length() - 1 ].
Вы же обращаетесь в этот вектор по индексу P.length(), что и приводит к ошибке.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости