Почему не получается вывести элемент вектора?
У меня есть вектор такого типа: vector<pair<int, int>> <название вектора>. У меня есть входной файл test.txt со следующими данными:
1 2
3 4
5 6
Мне нужно считать эти данные в мой вектор следующим образом:
vector[0].first = 1
vector[0].second = 2
vector[1].first = 3
vector[1].second = 4
vector[2].first = 5
vector[2].second = 6
Однако когда я считал, то я просто решил вывести vector[0].first, чтобы убедиться, что все считалось правильно, но мне что-то непонятное выдает:

Что я делаю не так?
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("test.txt");
int main() {
vector<pair<int, int>> ribs;
for (int i = 0; i < 3; i++) {
in >> ribs[i].first;
in >> ribs[i].second;
}
cout << ribs[0].first << endl;
//cout << ribs[0].second << endl;
//cout << ribs[1].first << endl;
//cout << ribs[1].second << endl;
//cout << ribs[2].first << endl;
//cout << ribs[2].second << endl;
return 0;
}
Ответы (2 шт):
Потому что, оператор [] у std::vector не добавляет новых элементов. Оператор [] нужен, чтобы получить доступ к уже ранее вставленному элементу в вектор.
В Вашем коде размер вектора равен 0, он пустой, поэтому, когда вы делаете in >> ribs[i].first;, Вы получаете ошибку out of range.
Чтобы вставить новый элемент в конец вектора, Вы можете использовать метод push_back(). Например, вы можете сделать так:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("test.txt");
int main() {
vector<pair<int, int>> ribs;
for (int i = 0; i < 3; i++) {
pair<int, int> temp;
in >> temp.first;
in >> temp.second;
ribs.push_back(temp);
}
cout << ribs[0].first << endl;
cout << ribs[0].second << endl;
cout << ribs[1].first << endl;
cout << ribs[1].second << endl;
cout << ribs[2].first << endl;
cout << ribs[2].second << endl;
return 0;
}
Помимо того, что пытаетесь инициализировать члены пустого вектора, не обращаете внимания ни на компактность кода, ни на быстроту выполнения. Кроме того, по какой то причине потоковый объект может потерять состояние good(например при достижении конца файла), и это нужно всегда проверять. Кроме этого, ваш код подразумевает, что вы точно знаете количество записанных в файле объектов, или вы сами хотите считывать всего 3 пары. Но лучше написать более обобщенный код, а потом принимать решение о выполнении. Например я бы написал(как минимум) так:
int a, b, i = 0;
while (in >> a && in >> b /* && i < 3 */) {
ribs.push_back({ a, b });
cout << ribs[i].first << '\n'
<< ribs[i].second << '\n';
++i;
}