Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.93/30: Рейтинг темы: голосов - 30, средняя оценка - 4.93
4 / 4 / 1
Регистрация: 11.04.2012
Сообщений: 44
1

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

30.07.2012, 10:46. Просмотров 6131. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2012, 10:46
Ответы с готовыми решениями:

Выход за пределы вектора ("Vector subscript out of range") - найти и исправить ошибку в коде
Имеется код: struct orders { string product; string mark; string surname; ...

Выход за пределы vector
Не могу понять почему происходит выход за пределы vectora после первого прохождения while....

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

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

41
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:46 21
Цитата Сообщение от yuron_477 Посмотреть сообщение
А так не проще?
Конечно проще. Но ТС другое выясняет, как, вообще, заполнять вектор используя автоматическое управление памятью. Тут вопрос не в том, чтобы одним значением заполнить.
0
554 / 508 / 25
Регистрация: 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
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:56 23
Цитата Сообщение от Tailor Посмотреть сообщение
вот все кажется понял, а как к примеру заумную операцию перевести
Если обращаться к элементам вектора через индекс, то надо контролировать значение индекса, с чего эта тема и началась.
0
4 / 4 / 1
Регистрация: 11.04.2012
Сообщений: 44
30.07.2012, 11:56  [ТС] 24
Цитата Сообщение от novi4ok Посмотреть сообщение
а что должна эта операция делать? словами сформулируй, что надо сделать. потому что ты сразу неудачный код с векторами привел, а теперь - кусочек старого. я не могу понять суперзадачу.
я боюс формулировать, ибо это целый проект на тему радиолокационных измерений, и писать тут я буду долго. Просто я узнал о векторах, какие они замечательные и заменил массивы на векторы
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 12:06 25
Цитата Сообщение от Tailor Посмотреть сообщение
я боюс формулировать, ибо это целый проект на тему радиолокационных измерений, и писать тут я буду долго. Просто я узнал о векторах, какие они замечательные и заменил массивы на векторы
я не прошу цель всего проекта выложить. просто этот цикл к чему-нибудь привязать. как эти массивы созданы, чем напичканы. тогда можно понять, что этот цикл с ними собирается делать.
0
4 / 4 / 1
Регистрация: 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
554 / 508 / 25
Регистрация: 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
5473 / 4868 / 831
Регистрация: 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
4 / 4 / 1
Регистрация: 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
~ Эврика! ~
1253 / 1002 / 74
Регистрация: 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
4 / 4 / 1
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 14:11  [ТС] 31
у меня выводит
-17891602
1
-17891602
-1
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2012, 14:42 32
В первом for(), замените это: i != arr.end(); на это: i < arr.end();.
1
4 / 4 / 1
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 14:47  [ТС] 33
Цитата Сообщение от alsav22 Посмотреть сообщение
В первом for(), замените это: i != arr.end(); на это: i < arr.end();.
пробовал, тоже самое
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2012, 15:01 34
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Эм...
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;
}
это был неправильный ответ. внутри такого цикла нельзя изменять вектор, иначе итератор становится "запорченным". лучше так:
C++
1
2
3
4
5
6
7
8
std::vector<int>v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
int size = v.size();
for (int i = size-1; i >=0; i--){
   v.insert (v.begin()+i, v.begin()+i);
}
проверь, может где какую мелочь подкрутить нужно, но думаю должно сработать.
это - на случай, если вектор небольшой, или производительность высокая не требуется. если случай другой, то лучше второй вектор создать, сразу зарезервировав память на двойную длину исходного вектора, проитерировать первый вектор, допивывая каждый его элемент в выходной элемент дважды. затем присвоить то, что получилось, первому. будет значительно (!) быстрее.
1
~ Эврика! ~
1253 / 1002 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
31.07.2012, 15:10 35
Ну я даже не знаю, почему у вас так. Есть failsafe-вариант, но его ж признают «нечестным».
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
#include <vector>
#include <iostream>
 
using namespace std;
 
int main()
{
    vector<int> arr;
    arr.push_back(1);
    arr.push_back(2);
    arr.push_back(3);
 
    vector<int> temp(arr.size() * 2);
    for (vector<int>::iterator i = arr.begin(); i != arr.end(); i++) {
        temp.push_back(*i);
        temp.push_back(*i);
    }
    arr = temp;
 
    for (vector<int>::iterator i = arr.begin(); i != arr.end(); i++) {
        cout << *i << endl;
    }
 
    return 0;
}
Цитата Сообщение от novi4ok Посмотреть сообщение
это был неправильный ответ. внутри такого цикла нельзя изменять вектор, иначе итератор становится "запорченным".
Не, там вся хитрость в i = arr.insert(i, *i);. Да, итератор инвалидируется, но insert возвращает правильный итератор после вставки, указывающий на вставленный элемент. Но, возможно, компилятор посчитал себя самым умным и проверку i != arr.end() закешировал, в итоге сравнивалось не пойми с чем, а не с валидным итератором.
1
4 / 4 / 1
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 15:13  [ТС] 36
Цитата Сообщение от novi4ok Посмотреть сообщение
это - на случай, если вектор небольшой
кстати вектор будет большим... может пара тысяч элементов
пишет, что не может конвертить из итератора в int
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2012, 15:21 37
Цитата Сообщение от Tailor Посмотреть сообщение
кстати вектор будет большим... может пара тысяч элементов
пишет, что не может конвертить из итератора в int
правильно пишет. исправь:

C++
1
v.insert (v.begin()+i, *(v.begin()+i));
по части пары тысяч элементов, то если это целые числа, то ты не заметишь разницы. но если будет реально тормозить, напиши, переделаем.

C++
1
2
3
4
5
6
7
8
9
10
11
12
std::vector<int>v;
std::vector<int>vtmp;
v.push_back(0);
v.push_back(1);
v.push_back(2);
vtmp.reserve (v.size() * 2);
std::vector<int>::const_iterator cit;
for (cit = v.begin(); cit != v.end(); cit++){
   vtmp.push_back(*cit);
   vtmp.push_back(*cit);
}
v = vtmp;// если нужно
1
4 / 4 / 1
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 15:29  [ТС] 38
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Есть failsafe-вариант
работает, но немного не так:
0
0
0
0
1
1
-1
-1

Добавлено через 7 минут
novi4ok,
исправил и теперь опять выдает
-17891602
1
-17891602
-1
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2012, 15:36 39
Цитата Сообщение от Tailor Посмотреть сообщение
исправил и теперь опять выдает
-17891602
1
-17891602
-1
я наступил на те же грабли, о которых предупредил. замени
C++
1
v.insert (v.begin()+i, *(v.begin());
на
C++
1
2
3
4
5
    
int value = 0;
...
    value = *(v.begin()+i);
       v.insert (v.begin()+i, value);
1
4 / 4 / 1
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 15:40  [ТС] 40
Цитата Сообщение от novi4ok Посмотреть сообщение
std::vector<int>v;
std::vector<int>vtmp;
v.push_back(0);
v.push_back(1);
v.push_back(2);
vtmp.reserve (v.size() * 2);
std::vector<int>::const_iterator cit;
for (cit = v.begin(); cit != v.end(); cit++){
vtmp.push_back(*cit);
vtmp.push_back(*cit);
}
v = vtmp;// если нужно
работает)
Всем спасибо!
продублировать это только пример, вообще есть некая n, которая принимает значение от 1 до 10. Дубляж это n=2. Ну, далее надеюсь сам затащу
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2012, 15:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Vector subscript out of range
Не понимаю что происходит, объясните пожалуста #include &quot;pch.h&quot; #include &lt;iostream&gt; #include...

Vector subscript out of range
Реализация карманной сортировки: #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; ...

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

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


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

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

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