Задача про быков и коров и Страуструпа, С++

Делаю код сам, конечно не идеальный, и проблема в том, что не могу вывести коров. Код перестает работать на 50 строчке (пишет ошибку 1748, связанную с векторами). Не понимаю, что не так, но проблема связана с этим кривым условием, которое придумал сам. (Первое число на скрине - загаданное компом, при этом цифры у этого числа соседние не могу повторяться, но если через раз или два, то могут)

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main()
{
    int p = 1;

    while (p) {

        int bull = 0;
        int cow = 0;
        int snum = 0;
        srand(time(NULL));

        vector <int>rand_num;
        vector <int>num;

        for (int i = 0; i < 4; ++i) {

            int s = rand() % 10;
            rand_num.push_back(s);

            if (i != 0 && rand_num[i] == rand_num[i - 1]) {
                rand_num.pop_back();
                i = i - 1;
               continue;
            }

        }
        for (int k : rand_num) cout << k;

        for (int u = 0; u < 4; ++u) {

            cout << "\nEnter " << u + 1 << " digit ";
            cin >> snum;

            num.push_back(snum);
        }
        cout << "\nYour number is ";
        for (int g : num) cout << g;

        for (int j = 0; j < 4; ++j) {
            if (rand_num[j] == num[j]) 
                ++bull;
        
        /*50 строчка кода начинается*/

            else if ((num[j] == rand_num[j + 1]) || (num[j] == rand_num[j + 2]) || (rand_num[j] == num[j + 3]) || (num[j] == rand_num[j - 1]) || (num[j] == rand_num[j - 2]) || (rand_num[j] == num[j - 3])) {
                ++cow;
            }
        }

        if (bull == 4) {
            cout << "You have won!" << endl;
            p = 0;
        }
        cout << "\n\nBulls - " << bull;
        cout << "\tCows - " << cow << endl;
    }
}

Проблема


Ответы (1 шт):

Автор решения: Harry

Ну смотрите сами — сколько вы помещаете элементов в вектора? По 4, так?

А обращаетесь к каким элементам?

for (int j = 0; j < 4; ++j) {
....

if ((num[j] == rand_num[j + 1]) || (num[j] == rand_num[j + 2]) || 
    (rand_num[j] == num[j + 3]) || (num[j] == rand_num[j - 1]) || 
    (num[j] == rand_num[j - 2]) || (rand_num[j] == num[j - 3])) {

При j==0 к какому элементу вы обращаетесь в num[j - 3]?

При j==3 к какому элементу вы обращаетесь в num[j + 3]?

Они у вас есть? С такими номерами? Да и с другими обращениями та же картина...

Вот и вся загадка...

→ Ссылка