Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 5.00
Tailor
3 / 3 / 1
Регистрация: 11.04.2012
Сообщений: 44
#1

Vector - out of range или выход за пределы - C++

30.07.2012, 10:46. Просмотров 3981. Ответов 41
Метки нет (Все метки)

Решил в своей программе динам. массивы заменить векторами. Вроде бы делаю все как надо, пушу конец... но когда i = 1000 то вылетает Expression: vector subscript out of range
C++
1
2
3
4
5
6
7
8
9
vector <double> mass_full(1000);
vector <double> mass_sum(1000);
iter = 512;
 
for(int i=0;i<iter*2;i++)
{
   mass_full.push_back(1); // тут и 1 пробовал, и i, но не помагает 
   mass_full.at(i+iter) = mass_sum[i];
}
я так понимаю, когда пишу mass_full.push_back(1), то резервируется 1 элемент
help plz
http://www.cyberforum.ru/cpp-beginners/thread2223484.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 10:46
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Vector - out of range или выход за пределы (C++):

Struct / Vector / Expression: vector subscript out of range
Добрый вечер. Имеется структура: struct Contact { public: string...

Vector out of range
Проблема очень проста. Есть программа, которая считывает txt файл и выводит...

Vector subscript out of range
int main() { srand( time(0) ); vector &lt;int&gt; m(10000); int i,n,c,max;...

vector subscript out of range
Доброго времени суток! Подскажите пожалуйста, где именно я ошибся, вроде не...

Vector subscript out of range
Доброе утро, прочитал статью про векторы и решил создать один из них, однако...

41
DiffEreD
1441 / 778 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.07.2012, 10:53 #2
Ну так у вас же в условии цикла i<iter*2 == 1024, а резмер масссивов 1000.
1
Tailor
3 / 3 / 1
Регистрация: 11.04.2012
Сообщений: 44
30.07.2012, 10:57  [ТС] #3
Цитата Сообщение от yuron_477 Посмотреть сообщение
Ну так у вас же в условии цикла i<iter*2 == 1024, а резмер масссивов 1000.
а push_back не прибавляет на 1? т.е. не будет после первого прохода цикла 1001?
тогда я не понимаю как память будет выделятся динамически... мне в моей программе не известно сколько элементов будет заранее
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
30.07.2012, 11:01 #4
Размер mass_sum - 1000, и нигде не увеличивается. А счетчик идет до 1023
1
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:04 #5
Цитата Сообщение от Tailor Посмотреть сообщение
я так понимаю, когда пишу mass_full.push_back(1), то резервируется 1 элемент
Тут вы 1 помещаете в конец вектора.

Цитата Сообщение от Tailor Посмотреть сообщение
мне в моей программе не известно сколько элементов будет
Тогда можно вообще не задавать размер вектора, а добавляйте элементы через mass_full.push_back(). Тогда память и будет выделяться динамически.
1
Tailor
3 / 3 / 1
Регистрация: 11.04.2012
Сообщений: 44
30.07.2012, 11:08  [ТС] #6
хорошо, а как написать, чтобы память все таки выделялась динамически? Вот надо мне посчитать что-то с 1000 элементов, потом 2000, или 10 000. Не буду же я писать
vector <double> mass_full(3000000000);

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут вы 1 помещаете в конец вектора.


Тогда можно вообще не задавать размер вектора, а добавляйте элементы через mass_full.push_back(). Тогда память и будет выделяться динамически.
понятно, благодарствую
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:09 #7
Например:
C++
1
2
3
4
5
6
7
8
 
vector <double> mass_full();
vector <double> mass_sum(1000, 0);
 
for(int i=0;i<1000;i++)
{
   mass_full.push_back(mass_sum[i]); 
}
Заполнит mass_full нолями из mass_sum.
В mass_full, при применении push_back, память будет выделяться динамически.
1
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
30.07.2012, 11:10 #8
Не надо изначально задавать размер вектора. Метод push_back() сам динамически увеличит его размер. То есть:

C++
1
2
3
4
vector <int> vec; // в векторе нет элементов
 
vec.push_back(34); // теперь в векторе один элемент со значением 34
vec.push_back(67); // теперь два элемента (34 и 67)
1
Jupiter
30.07.2012, 11:11
  #9

Не по теме:

alsav22, это

Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
vector <double> mass_full();
прототип функции, а не вектор

0
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
30.07.2012, 11:17 #10
Jupiter, разве? По этой логике и
int a(); - тоже прототип? Разве здесь не конструктор?
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:20 #11
Есть такой метод вектора как resize(). Параметр задаёт новый размер вектора. Для быстроты операций с вектором, можно предварительно зарезервировать за ним память методом reserve(). Параметр - ёмкость вектора (но не размер, не путать).

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
прототип функции, а не вектор
Прошу прощения, описка.
0
Tailor
3 / 3 / 1
Регистрация: 11.04.2012
Сообщений: 44
30.07.2012, 11:21  [ТС] #12
А вот еще вопрос, есть старый код

C++
1
2
3
4
for(int i=0;i<iter;i++)
{
   mass_full[i] = 0;
}
Если тоже самое написать с пуш беком


C++
1
2
3
4
for(int i=0;i<iter;i++)
{
   mass_full.push_back(mass_full[i]=0);
}
так?
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:22 #13
Цитата Сообщение от nexen Посмотреть сообщение
По этой логике и
int a(); - тоже прототип?
Конечно, прототип. Функция a, ничего не принимает, возвращает int.
1
Jupiter
30.07.2012, 11:23
  #14

Не по теме:

Цитата Сообщение от nexen Посмотреть сообщение
int a(); - тоже прототип?
именно
Цитата Сообщение от nexen Посмотреть сообщение
разве?
не веришь, так скомпилируй

1
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:32 #15
Цитата Сообщение от Tailor Посмотреть сообщение
так?
C++
1
2
3
4
for(int i=0;i<iter;i++)
{
   mass_full.push_back(0);
}
Заполнит mass_full iter-1 нолём.
1
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 11:38 #16
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
2
3
4
for(int i=0;i<iter;i++)
{
   mass_full.push_back(0);
}
Заполнит mass_full iter-1 нолём.
уточнение: не iter-1, a iter. т.е. в результате длина вектора будет iter (если до того был пустой, разумеется)

но проще так:

C++
1
2
mass_full.clear();
mass_full.resize (iter, 0);
так можно хоть нулями, хоть чем угодно (правда, все одинаковое)
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:41 #17

Не по теме:

nexen, сам посуди, как тогда компилятор разбирался бы в таком: vector<int> f();

. То ли это прототип функции, которая возвращает vector<int>, то ли объявление объекта типа vector<int> и инициализация его конструктором по умолчанию.
0
DiffEreD
1441 / 778 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.07.2012, 11:44 #18
Цитата Сообщение от Tailor Посмотреть сообщение
А вот еще вопрос, есть старый код
А так не проще?
C++
1
2
const int iter = 500;
vector<int> vec(iter, 0);
1
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:44 #19
Цитата Сообщение от novi4ok Посмотреть сообщение
уточнение: не iter-1, a iter
Да. Прошу прощения.
0
Tailor
3 / 3 / 1
Регистрация: 11.04.2012
Сообщений: 44
30.07.2012, 11:44  [ТС] #20
вот все кажется понял, а как к примеру заумную операцию перевести
C++
1
2
3
4
for(int i=0;i<iter;i++)
{
   mass_full[i+iter] = mass_sum[i];
}
0
30.07.2012, 11:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 11:44
Привет! Вот еще темы с решениями:

Vector subscript out of range
Помогите пожалуйста, выводит такую ошибку , не пойму почему ...

Vector subscript out of range
Привет, друзья, у меня следующая проблема: if (!MeteorVec.empty()) {...

Expression:vector subscript out of range
Написал программа, скинул в текстовый файл неотформатированный текс, все...

Ошибка: Vector subscript out of range
Всю голову сломал, не вижу где ошибка...Выводит только первые 5 итераций,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru