Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 5.00
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
#1

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

30.07.2012, 10:46. Просмотров 3626. Ответов 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
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 - C++
Добрый вечер. Имеется структура: struct Contact { public: string name; vector&lt;string&gt; phoneNumber; };

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

Vector subscript out of range - C++
int main() { srand( time(0) ); vector &lt;int&gt; m(10000); int i,n,c,max; while(i&lt;=10000) { m.push_back(rand()%4); i++; }...

Vector subscript out of range - C++
Доброе утро, прочитал статью про векторы и решил создать один из них, однако при выводе он выдаёт ошибку: &quot;Vector subscript out of range&quot;...

Vector subscript out of range - C++
Привет, друзья, у меня следующая проблема: if (!MeteorVec.empty()) { for (int i = 0; i &lt; MeteorVec.size(); i++) { ...

Vector subscript out of range - C++
Помогите пожалуйста, выводит такую ошибку , не пойму почему #include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;stdio.h&gt; #include...

41
novi4ok
551 / 504 / 8
Регистрация: 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
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:41 #17

Не по теме:

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

. То ли это прототип функции, которая возвращает vector<int>, то ли объявление объекта типа vector<int> и инициализация его конструктором по умолчанию.
0
DiffEreD
1430 / 767 / 95
Регистрация: 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
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:44 #19
Цитата Сообщение от novi4ok Посмотреть сообщение
уточнение: не iter-1, a iter
Да. Прошу прощения.
0
Tailor
3 / 3 / 0
Регистрация: 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
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:46 #21
Цитата Сообщение от yuron_477 Посмотреть сообщение
А так не проще?
Конечно проще. Но ТС другое выясняет, как, вообще, заполнять вектор используя автоматическое управление памятью. Тут вопрос не в том, чтобы одним значением заполнить.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 11:54 #22
Цитата Сообщение от Tailor Посмотреть сообщение
вот все кажется понял, а как к примеру заумную операцию перевести
C++
1
2
3
4
for(int i=0;i<iter;i++)
{
   mass_full[i+iter] = mass_sum[i];
}
а что должна эта операция делать? словами сформулируй, что надо сделать. потому что ты сразу неудачный код с векторами привел, а теперь - кусочек старого. я не могу понять суперзадачу.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:56 #23
Цитата Сообщение от Tailor Посмотреть сообщение
вот все кажется понял, а как к примеру заумную операцию перевести
Если обращаться к элементам вектора через индекс, то надо контролировать значение индекса, с чего эта тема и началась.
0
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
30.07.2012, 11:56  [ТС] #24
Цитата Сообщение от novi4ok Посмотреть сообщение
а что должна эта операция делать? словами сформулируй, что надо сделать. потому что ты сразу неудачный код с векторами привел, а теперь - кусочек старого. я не могу понять суперзадачу.
я боюс формулировать, ибо это целый проект на тему радиолокационных измерений, и писать тут я буду долго. Просто я узнал о векторах, какие они замечательные и заменил массивы на векторы
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 12:06 #25
Цитата Сообщение от Tailor Посмотреть сообщение
я боюс формулировать, ибо это целый проект на тему радиолокационных измерений, и писать тут я буду долго. Просто я узнал о векторах, какие они замечательные и заменил массивы на векторы
я не прошу цель всего проекта выложить. просто этот цикл к чему-нибудь привязать. как эти массивы созданы, чем напичканы. тогда можно понять, что этот цикл с ними собирается делать.
0
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
30.07.2012, 12:18  [ТС] #26
в общем есть массив mass_sum. Он получается в результате алгоритма.
например
iter = 3;
mass_sum[3] {1,-1,-1};
далее к массиву с начала и конца прибавляются нули, кол-во нулей с начала и конца = iter
это и будет mass_full
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//заполняем начало массива нулями
             for (int i=0; i < iter; i++)
             {
                 mass_full.push_back(0);
                // mass_full[i] = 0;
                
             }
 
            
             //заполняем середину массива суммами
             for (int i=0; i < iter*2; i++)
             {    
                  mass_full.at(i+iter) = mass_sum[i];
             }
              //заполняем конец массива нулями
             for (int i=iter*3; i > iter*2; i--)
             {
                
                 mass_full[i-1] = 0;
             }
как то так
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 12:29 #27
тогда можно так:

C++
1
2
3
4
5
6
//заполняем начало вектора нулями
mass_full.clear();// на всякий случай
mass_full.resize (iter, 0); // записали iter нулей. в векторе - 0,0,0
mass_full.insert (mass_full.end(), mass_sum.begin(), mass_sum.end());// дописали в хвост 
                   // содержимое вектора "сум". в векторе теперь - 0,0,0,1,-1,-1
mass_full.insert (mass_full.end(), iter, 0);// дописали в хвост еще iter  нулей. в векторе - 0,0,0,1,-1,-1,0,0,0
в принципе, если это всегда будет так, то можно сразу записать в вектор iter*2 нулей, затем в середину вставить содержимое второго вектора. если производительность важна, сразу сделать reserve вектора на макс длину (iter*3), потом все манипуляции. как уже здесь кто-то сказал, reserve не добавляет элементов, как это делает resize, он только память резервирует, чтобы в дальнейшем ее не выделять при надобности.
1
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 12:41 #28
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
const int ITER = 3;
const int N = 3;    
 
int mass_sum[N] = {1,-1,-1};
 
vector<int> mass_full;
 
for (int i = 0; i < ITER; i++)
{
    mass_full.push_back(0);
                
}
 
//заполняем середину массива суммами
for (int i = 0; i < N; i++)
{    
     mass_full.push_back(mass_sum[i]);
}
 
//заполняем конец массива нулями
for (int i = 0; i < ITER; i++)
{
     mass_full.push_back(0);
}
            
system("pause");
return 0;
}
Или так:
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
const int ITER = 3;
const int N = 3;    
int arr[N] = {1,-1,-1};
 
vector<int> mass_sum;
for (int i = 0; i < N; i++)
{    
     mass_sum.push_back(arr[i]);
}
 
vector<int> mass_full; //заполняем начало массива 0.
 
for (int i = 0; i < ITER; i++)
{
    mass_full.push_back(0);
                
}
 
//заполняем середину массива суммами
for (int i = 0; i < mass_sum.size(); i++)
{    
     mass_full.push_back(mass_sum[i]);
}
 
//заполняем конец массива нулями
for (int i = 0; i < ITER; i++)
{
     mass_full.push_back(0);
}
            
system("pause");
return 0;
}
1
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 12:24  [ТС] #29
В одну кучу...
теперь задача чтоб каждый элемент вектора дублировать в соседнюю ячейку.
Например
vector <int> arr;
arr.push_back(1);
arr.push_back(-1);

значит будет в массиве 1,-1.
нужно чтобы было 1,1,-1,-1.
Вот моя попытка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const int n=2;
    vector <int> arr;
 
    arr.push_back(1);
    arr.push_back(-1);
 
    int j=1;
    for (int i=0;i<n;i++)
    {
        arr.insert(arr.begin()+j,arr[i]);
        j++;
    }
   for (int i=0;i<arr.capacity();i++)
   {
        cout << arr[i] << endl; 
   }
 
    system("pause");
    return 0;
не получается дублировать, получается мусор. Все из-за arr[i] но как по другому, если там нельзя вставить еще итератор, только int
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
31.07.2012, 13:33 #30
Эм...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <vector>
#include <iostream>
 
using namespace std;
 
int main()
{
    vector<int> arr;
    arr.push_back(1);
    arr.push_back(-1);
 
    for (vector<int>::iterator i = arr.begin(); i != arr.end(); i += 2) {
        i = arr.insert(i, *i);
    }
 
    for (vector<int>::iterator i = arr.begin(); i != arr.end(); i++) {
        cout << *i << endl;
    }
 
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 13:33
Привет! Вот еще темы с ответами:

vector subscript out of range - C++
Доброго времени суток! Подскажите пожалуйста, где именно я ошибся, вроде не должен он за пределы выходить по коду: const...

Vector iterator + offset out of range - C++
Вылазит такая ошибка. Подскажите, из-за чего она может вылезти?

Expression:vector subscript out of range - C++
Написал программа, скинул в текстовый файл неотформатированный текс, все работало, как только отформатировал текст вручную появилась...

Vector subscript out of range (push_back, a не []) - C++
При попытке сделать push_back() вектору вылетает ошибка vector subscript out of range. Именно при пуше, не при операторе . Ошибка в...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
31.07.2012, 13:33
Закрытая тема Создать тему
Опции темы

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