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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 5.00
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
30.07.2012, 10:46     Vector - out of range или выход за пределы #1
Решил в своей программе динам. массивы заменить векторами. Вроде бы делаю все как надо, пушу конец... но когда 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 10:46     Vector - out of range или выход за пределы
Посмотрите здесь:

vector subscript out of range C++
C++ Vector iterator + offset out of range
C++ Vector subscript out of range
C++ Ошибка: Vector subscript out of range
C++ Vector subscript out of range
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:46     Vector - out of range или выход за пределы #21
Цитата Сообщение от yuron_477 Посмотреть сообщение
А так не проще?
Конечно проще. Но ТС другое выясняет, как, вообще, заполнять вектор используя автоматическое управление памятью. Тут вопрос не в том, чтобы одним значением заполнить.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 11:54     Vector - out of range или выход за пределы #22
Цитата Сообщение от Tailor Посмотреть сообщение
вот все кажется понял, а как к примеру заумную операцию перевести
C++
1
2
3
4
for(int i=0;i<iter;i++)
{
   mass_full[i+iter] = mass_sum[i];
}
а что должна эта операция делать? словами сформулируй, что надо сделать. потому что ты сразу неудачный код с векторами привел, а теперь - кусочек старого. я не могу понять суперзадачу.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 11:56     Vector - out of range или выход за пределы #23
Цитата Сообщение от Tailor Посмотреть сообщение
вот все кажется понял, а как к примеру заумную операцию перевести
Если обращаться к элементам вектора через индекс, то надо контролировать значение индекса, с чего эта тема и началась.
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
30.07.2012, 11:56  [ТС]     Vector - out of range или выход за пределы #24
Цитата Сообщение от novi4ok Посмотреть сообщение
а что должна эта операция делать? словами сформулируй, что надо сделать. потому что ты сразу неудачный код с векторами привел, а теперь - кусочек старого. я не могу понять суперзадачу.
я боюс формулировать, ибо это целый проект на тему радиолокационных измерений, и писать тут я буду долго. Просто я узнал о векторах, какие они замечательные и заменил массивы на векторы
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 12:06     Vector - out of range или выход за пределы #25
Цитата Сообщение от Tailor Посмотреть сообщение
я боюс формулировать, ибо это целый проект на тему радиолокационных измерений, и писать тут я буду долго. Просто я узнал о векторах, какие они замечательные и заменил массивы на векторы
я не прошу цель всего проекта выложить. просто этот цикл к чему-нибудь привязать. как эти массивы созданы, чем напичканы. тогда можно понять, что этот цикл с ними собирается делать.
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
30.07.2012, 12:18  [ТС]     Vector - out of range или выход за пределы #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;
             }
как то так
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 12:29     Vector - out of range или выход за пределы #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, он только память резервирует, чтобы в дальнейшем ее не выделять при надобности.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 12:41     Vector - out of range или выход за пределы #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;
}
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 12:24  [ТС]     Vector - out of range или выход за пределы #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
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
31.07.2012, 13:33     Vector - out of range или выход за пределы #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;
}
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 14:11  [ТС]     Vector - out of range или выход за пределы #31
у меня выводит
-17891602
1
-17891602
-1
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2012, 14:42     Vector - out of range или выход за пределы #32
В первом for(), замените это: i != arr.end(); на это: i < arr.end();.
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 14:47  [ТС]     Vector - out of range или выход за пределы #33
Цитата Сообщение от alsav22 Посмотреть сообщение
В первом for(), замените это: i != arr.end(); на это: i < arr.end();.
пробовал, тоже самое
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2012, 15:01     Vector - out of range или выход за пределы #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);
}
проверь, может где какую мелочь подкрутить нужно, но думаю должно сработать.
это - на случай, если вектор небольшой, или производительность высокая не требуется. если случай другой, то лучше второй вектор создать, сразу зарезервировав память на двойную длину исходного вектора, проитерировать первый вектор, допивывая каждый его элемент в выходной элемент дважды. затем присвоить то, что получилось, первому. будет значительно (!) быстрее.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
31.07.2012, 15:10     Vector - out of range или выход за пределы #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() закешировал, в итоге сравнивалось не пойми с чем, а не с валидным итератором.
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 15:13  [ТС]     Vector - out of range или выход за пределы #36
Цитата Сообщение от novi4ok Посмотреть сообщение
это - на случай, если вектор небольшой
кстати вектор будет большим... может пара тысяч элементов
пишет, что не может конвертить из итератора в int
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2012, 15:21     Vector - out of range или выход за пределы #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;// если нужно
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 15:29  [ТС]     Vector - out of range или выход за пределы #38
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Есть failsafe-вариант
работает, но немного не так:
0
0
0
0
1
1
-1
-1

Добавлено через 7 минут
novi4ok,
исправил и теперь опять выдает
-17891602
1
-17891602
-1
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2012, 15:36     Vector - out of range или выход за пределы #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);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 15:40     Vector - out of range или выход за пределы
Еще ссылки по теме:

Vector subscript out of range C++
C++ Vector out of range
Vector subscript out of range C++

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

Или воспользуйтесь поиском по форуму:
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 15:40  [ТС]     Vector - out of range или выход за пределы #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. Ну, далее надеюсь сам затащу
Yandex
Объявления
31.07.2012, 15:40     Vector - out of range или выход за пределы
Закрытая тема Создать тему
Опции темы

Текущее время: 02:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru