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

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

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

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

30.07.2012, 10:46. Просмотров 3630. Ответов 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
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 14:11  [ТС] #31
у меня выводит
-17891602
1
-17891602
-1
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2012, 14:42 #32
В первом for(), замените это: i != arr.end(); на это: i < arr.end();.
1
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 14:47  [ТС] #33
Цитата Сообщение от alsav22 Посмотреть сообщение
В первом for(), замените это: i != arr.end(); на это: i < arr.end();.
пробовал, тоже самое
0
novi4ok
551 / 504 / 8
Регистрация: 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
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 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
Tailor
3 / 3 / 0
Регистрация: 11.04.2012
Сообщений: 44
31.07.2012, 15:13  [ТС] #36
Цитата Сообщение от novi4ok Посмотреть сообщение
это - на случай, если вектор небольшой
кстати вектор будет большим... может пара тысяч элементов
пишет, что не может конвертить из итератора в int
0
novi4ok
551 / 504 / 8
Регистрация: 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
Tailor
3 / 3 / 0
Регистрация: 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
novi4ok
551 / 504 / 8
Регистрация: 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
Tailor
3 / 3 / 0
Регистрация: 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
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2012, 15:46 #41
если сделаешь изменения в "старом", то тоже заработает. но лучше с двумя векторами.
1
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2012, 15:50 #42
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(-1);
    
    int temp; 
    for (vector<int>::iterator i = arr.begin(); i < arr.end(); i += 2)
    {
        temp = *i;
        i = arr.insert (i, temp);
    }
    
    for (vector<int>::iterator i = arr.begin(); i != arr.end(); i++)
    {
        cout << *i << endl;
    }
 
    system("pause");
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 15:50
Привет! Вот еще темы с ответами:

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. Именно при пуше, не при операторе . Ошибка в...


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

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

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