Вектор <int>вход и выход - PullRequest
0 голосов
/ 04 марта 2012

Я застрял с простыми операциями ввода и вывода вектора. Компилятор возвращает сообщение об ошибке «std :: outof range»

Вот код

int main()
{
int size;
cout <<"Enter size of vector\n";
cin>>size;
cout<<"Now to input the vector of size "<<size<<endl;
vector <int> trial;
for (size_t i=0;i<size;++i){
    int x;
    cout<<"write at position"<<trial.at(i)<<'t';
    cin>>x;
    trial.push_back(x);
    cout<<endl;
}
ostream_iterator<int> output(cout,"");
copy(trial.begin(),trial.end(),output);
}

Буду признателен за краткое объяснение внутренней работы проблемы.

Ответы [ 4 ]

5 голосов
/ 04 марта 2012

Вы вызываете trial.at(i) до trial.push_back(x), получая доступ к еще не существующему элементу.Поскольку элемент (пока) не существует, i является недопустимым индексом, а at() выдает исключение std::out_of_range при передаче недопустимого индекса.Если исключение не было обнаружено, оно завершит работу программы.Предположительно библиотека времени выполнения вашей платформы отображает исключение, которое вызвало завершение программы.

Я полагаю, что вы действительно хотите это:

std::cout << "write at position " << i << '\t';
2 голосов
/ 04 марта 2012

Рассмотрим первую итерацию этого цикла:

vector <int> trial;
for (size_t i=0;i<size;++i){
    int x;
    cout<<"write at position"<<trial.at(i)<<'t';

На первой итерации в вектор ничего не вставлялось, поэтому trial.at(0) еще не действует. Результат будет исключением. Поскольку у вас нет try / catch, это завершит выполнение вашей программы.

Мне кажется, что вы хотите cout << "write at position " << i; вместо этого. i - позиция; после того, как он был помещен в вектор, так что он действителен, vector.at(i) будет значением в этой позиции.

0 голосов
/ 04 марта 2012

Проблема в этой строке:

cout<<"write at position"<<trial.at(i)<<'t';

Вы вызываете это до того, как задаете размер вектора.Я не совсем уверен, что эта линия пытается выполнить в любом случае.Если вы пытаетесь распечатать позицию в памяти (адрес), которая не будет этого делать, если вы пытаетесь напечатать то, что уже было там, это сработает, если оно уже было выделено.Использование vector::push_back() означает, что вам не нужно предварительно выделять.

Вы можете исправить это, изменив размер vector и получив прямой доступ к элементам следующим образом:

trial.resize(size);
// loop
// vector.push_back(x) -- now becomes
vector[i] = x;

Или,Вы можете просто удалить печать позиции и использовать push_back(), как вы сейчас.

Поскольку кажется, что вы исследуете, как использовать vector, я бы предложил попытаться понять, как *Методы 1015 * и resize() отличаются друг от друга и также смотрят на функцию vector::reserve().

0 голосов
/ 04 марта 2012
trial.at(i)

Вы получаете доступ к элементу, который не существует.

Возможно, вы все равно хотите cout<<"write at position"<< i <<'t';.

...