Структуры, ошибка vector Out of range [закрыт]

143
21 января 2021, 00:10
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

Закрыт 1 год назад.

Улучшить вопрос

Задача такова

Описать используя структуру, жителей(фамилия, город, улица, дом, квартира). Составьте программу, которая печатает фамилии двух любых жителей из списка, живущих в разных городах по одинаковому адресу.

После ввода всех данных,фамилии,города и т.д. выдает ошибку

vector subcript out of range

Я понимаю что одна из переменных выходит за рамки вектора, но в чем именно я допустил ошибку?

   #include <iostream> 
    #include<Windows.h> 
    #include <sstream> 
    #include <string>
    #include <vector> 
    using namespace std;
    using namespace msclr::interop;
    struct peoples {
        string fam;
        string city;
        string street;
        int home;
        int kvart;
    };
    std::vector<peoples> list;
    int main() {
    int c;                              
    SetConsoleCP(1251);                 
    SetConsoleOutputCP(1251);
    cout << "Введите количество человек : ";
    cin >> c;
    string fam;
    string city;
    string street;
    int home;
    int kvart;

    for (int i = 0; i != c; i++) {
        cout << "Введите фамилию " << i+1 << " человека : ";
        cin >> fam;
        cout << "Введите город " << i + 1 << " человека : ";
        cin >> city;
        cout << "Введите улицу " << i + 1 << " человека : ";
        cin >> street;
        cout << "Введите дом " << i + 1 << " человека : ";
        cin >> home;
        cout << "Введите квартиру " << i + 1 << " человека : ";
        cin >> kvart;
        list.push_back({fam, city,street,home,kvart });
        cout << "=============================" << endl;
    }
    int num = 0;
    int k = 0;
    for (num = 0; num < 5; num++) {
        for (k = 5; k > num; k - 1) {
            if (list[num].city != list[k].city && list[num].home == list[k].home && list[num].street == list[k].street && list[num].kvart == list[k].kvart) {
                cout << " Найден одинаковый адрес с разными городами" << endl;
            }
        }
    }
    cout << "=============================" << endl;
    system("pause");
}
Answer 1

Если вы используете C++, то разумно использовать инструменты этого языка.

В вашем случае, гораздо проще будет использовать find_if:

for (num = 0; num < list.size(); num++)
{
   auto a = std::find_if(list.begin(), list.end(),
             [=](const peoples & p) -> bool {
               return ("ваш набор проверок: p.city == list[num].city итд");
             });
   if (a != list.end())
      std::cout << "found!";
}

Подробнее про find_* https://ru.cppreference.com/w/cpp/algorithm/find

При таком решении, разумно добавить поле id в struct peoples, для быстрой идентификации обьекта. И тогда получиться такой код:

 ...
  [=](const peoples & p) -> bool {
         if (p.id == list[num].id) return false;
           return ("ваш набор проверок: p.city == list[num].city итд");
         });
 ...

Если вводить дополнительное поле нет возможности из каких-то соображений, можно попробывать использовать memcmp:

 ...
  [=](const peoples & p) -> bool {
         if (memcmp(&p,&list[num],sizeof(p)) == 0) return false;
           return ("ваш набор проверок: p.city == list[num].city итд");
         });
 ...
Answer 2

Следующим циклом:

for (num = 0; num < 5; num++) {
        for (k = 5;   k - 1) {..}

вы задаете следующую команду:

num = 0;  
k = 5; // откуда это число, непонятно
if ( num < 5  &&  k > num; ) 
//если чуть чуть подумаете, то это условие верно всегда
//так что вы получаете бесконечный цикл. И дальше:
if (list[num].city != list[k].city // и т.д
/*stop! вы до этого  вектор заполняли некоторым количеством элементов
это количество вы ввели в переменную `c`.  Что вы ввели, никому неизвестно, поэтому уже может быть выход за пределы. */
//дальше:
num++;
k - 1;

так как вы получили бесконечный цикл, то значение num увеличивается бесконечно, а это уже не только очевидный выход за пределы... А k - 1 это есть некое значение, записанное в другое(временное) переменное, а значение k вообше не меняется. Так что у вас не одна ошибка, а целая куча очевидных логических ошибок, и вам стоит понимать что пишете, а не просто взять и написать(лишбы было)

READ ALSO
Наложение иконки на изображение

Наложение иконки на изображение

Крч, дело такое, верстаю себе лендинг, и тут откуда не возьмись появился в

129
Подскажите, пожалуйста, что такое:

Подскажите, пожалуйста, что такое:

Это функции из редактора PhpStorm

89
как лучше сверстать слайдер в картинке?

как лучше сверстать слайдер в картинке?

Вот как должно выглядеть , сам слайдер это цветная картинка, серый фон статичный

127
Вывод текста на одной строке html

Вывод текста на одной строке html

Мне надо использовать цвета background и colorЯ пишу так

130