Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику 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");
}
Если вы используете 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 итд");
});
...
Следующим циклом:
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
вообше не меняется. Так что у вас не одна ошибка, а целая куча очевидных логических ошибок, и вам стоит понимать что пишете, а не просто взять и написать(лишбы было)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Крч, дело такое, верстаю себе лендинг, и тут откуда не возьмись появился в
Вот как должно выглядеть , сам слайдер это цветная картинка, серый фон статичный