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

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

Войти
Регистрация
Восстановить пароль
 
 
SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
#1

Vector subscript out of range (push_back, a не []) - C++

23.10.2013, 23:26. Просмотров 927. Ответов 15
Метки нет (Все метки)

При попытке сделать push_back() вектору вылетает ошибка vector subscript out of range. Именно при пуше, не при операторе []. Ошибка в конструкторе Population (где именно обозначил). Ее там быть не должно, как я знаю. 2 заголовочных, 3 .сpp
ЗЫ. Программа моделирует работу Генетического Алгоритма.
Код под спойлером
Кликните здесь для просмотра всего текста
MAIN__CPP
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <time.h>
#include "Individual.h"
#include "Population.h"
 
using namespace std;
 
int main(){
    int numberOfCPU=3;
    int numberOfTasks=13;
    int leftb=4,rightb=20;
    int s=10;
    int stop=60;
    int prPair=60;
    int prMut=20;
    int *cpuload=new int[numberOfCPU];
    int *task=new int[numberOfTasks];
    for(int i=0;i<numberOfTasks;i++){
            task[i]=rand()%(rightb-leftb+1)+leftb;
    }
 
 
 
    Population population(s,task,numberOfCPU,numberOfTasks, prPair, prMut, stop);
    population.showPopulation();
 
    system("pause");
    return 0;
}

INDIVIDUAL__H
Кликните здесь для просмотра всего текста
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 <vector>
#ifndef INDIVDUAL_H
#define INDIVDUAL_H
using namespace std;
 
class Population;
 
class Individual{
    friend class Population;
 
    static int numberOfcpu;
    static short int DNAL;//number of Tasks in that Ind.
    static vector<int> task;//vector with weights of tasks                          ALL
    
    vector<unsigned char> gene;//                                                   VECTORS     
    vector<int> cpuNumber;//contains CPU number. CPU numeration begin from Zero     SAME SIZE
    
    int res;//max. time; objective function result
    vector<int> cpuResult;
    int indNumber; //number in population
public:
    Individual(int* _tasks, int numberOfTasks, int numberOfProc, int number);
    Individual(int number);
    Individual(const Individual&);
    int ObjectFunction();
    void showFullInfo();
    void showInfo();
    void reFindResult();//recalculate result of ObjFunc
    void calcCpuResults();//recalculate cpu result's
 
    static void swap(Individual a,Individual b);//swap data. (for pairing)
};
 
#endif

INDIVIDUAL__CPP
Кликните здесь для просмотра всего текста
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <vector>
#include <iostream>
#include <time.h>
#include <iomanip>
#include "Individual.h"
using namespace std;
 
int Individual::numberOfcpu;
short int Individual::DNAL;
vector<int> Individual::task;
 
Individual::Individual(int* _tasks, int numberOfTasks, int numberOfProc, int number){
    indNumber=number;
    numberOfcpu=numberOfProc;
    DNAL=numberOfTasks;
    for(int i=0;i<DNAL;i++){
        task.push_back(_tasks[i]);
        gene.push_back(static_cast<unsigned char>(rand()%256));
    }
 
    int step=256/numberOfProc;
    
    for(int i=0;i<DNAL;i++){
        if(gene[i]%step==0){
            cpuNumber.push_back((gene[i]/step)-1);
        }
        else cpuNumber.push_back(gene[i]/step);
    }
    for(int i=0;i<numberOfcpu;i++){
        cpuResult.push_back(0);
    }
    for(int i=0;i<DNAL;i++){
        cpuResult[cpuNumber[i]]+=task[i];
    }
 
    res=cpuResult[0];
    for(int i=1;i<numberOfProc;i++){
        if(res<cpuResult[i])res=cpuResult[i];
    }
}
Individual::Individual(int number){
    indNumber=number;
    int step=256/numberOfcpu;
 
    for(int i=0;i<DNAL;i++){
        gene.push_back(static_cast<unsigned char>(rand()%256));
        if(gene[i]%step==0){
            cpuNumber.push_back((gene[i]/step)-1);
        }
        else cpuNumber.push_back(gene[i]/step);
    }
    for(int i=0;i<numberOfcpu;i++){
        cpuResult.push_back(0);
    }
    for(int i=0;i<DNAL;i++){
        cpuResult[cpuNumber[i]]+=task[i];
    }
 
    res=cpuResult[0];
    for(int i=1;i<numberOfcpu;i++){
        if(res<cpuResult[i])res=cpuResult[i];
    }
}
Individual::Individual(const Individual& p){
    for(int i=0;i<DNAL;i++){
        gene[i]=p.gene[i];
        cpuNumber[i]=p.gene[i];
    }
    res=p.res;
    for(int i=0;i<numberOfcpu;i++){
        cpuResult[i]=p.cpuNumber[i];
    }
}
void Individual::swap(Individual a,Individual b){
    for(int i=0;i<DNAL;i++){
        swap(a.gene[i],b.gene[i]);
        swap(a.cpuNumber[i],b.cpuNumber[i]);
    }
    a.calcCpuResults();
    a.reFindResult();
    b.calcCpuResults();
    b.reFindResult();
}
 
void Individual::showFullInfo(){
    cout<<"Individual's number: "<<indNumber<<endl;
    cout<<"Number of Processors & Tasks: "<<numberOfcpu<<" & "<<DNAL<<endl;
    cout<<"Length of DNA: "<<DNAL<<endl;
    for(int j=0;j<4;j++){
        switch(j){
        case 0:
            cout<<setw(7)<<"Number:";
            for(int i=0;i<DNAL;i++){
                cout<<setw(4)<<i;
            }
            cout<<endl;
            break;
        case 1:
            cout<<setw(7)<<"Weight:";
            for(int i=0;i<DNAL;i++){
                cout<<setw(4)<<task.at(i);
            }
            cout<<endl;
            break;
        case 2:
            cout<<setw(7)<<"Gene:";
            for(int i=0;i<DNAL;i++){
                cout<<setw(4)<<static_cast<int>(gene[i]);
            }
            cout<<endl;
            break;
        case 3:
            cout<<setw(7)<<"CPU:";
            for(int i=0;i<DNAL;i++){
                cout<<setw(4)<<cpuNumber.at(i);
            }
            cout<<endl;
            break;
        }
    }
    for(int i=0;i<numberOfcpu;i++){
        cout<<"CPU"<<i<<" ("<<cpuResult[i]<<")\n";
    }
    cout<<"Objective function: "<<res<<endl;
}
void Individual::showInfo(){
    cout<<indNumber<<"(S:"<<res<<")";
}
void Individual::reFindResult(){
    res=cpuResult[0];
    for(int i=1;i<numberOfcpu;i++){
        if(res<cpuResult[i])res=cpuResult[i];
    }
}
void Individual::calcCpuResults(){
    for(int i=0;i<numberOfcpu;i++){
        Individual::cpuResult[i]=0;
    }
    for(int i=0;i<DNAL;i++){
        Individual::cpuResult[cpuNumber[i]]+=task[i];
    }
}

POPULATION__H
Кликните здесь для просмотра всего текста
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
#include "Individual.h"
#include <vector>
 
#ifndef POPULATION_H
#define POPULATION_H
class Population{
    int sizeOfPop;
    int popNumber;
    int globalIndNumber;
    int probabilityPair;//percents
    int probabilityMut;//percents
    int bestIndiNumber;
    int stoppingCrit;//
 
    vector<Individual> individual;
    vector<Individual> nextGeneration;
 
public:
    Population(int _size, int* task, int numberOfProc, int numberOfTasks,int prPair, int Mut, int stop);
    void showPopulation();
    void calcBestIndiNumber();//calc and return number of Best Individual;
    void pairing(Individual &a, Individual &b);//a and b - individuals in population
    void mutation(Individual &a);
    void newGeneration();// create new generation (0->sizeOfPop) 
    void GA();
};
#endif

POPULATION__CPP
Кликните здесь для просмотра всего текста
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "Population.h"
#include "Individual.h"
#include <iostream>
#include <vector>
using namespace std;
 
Population::Population(int _size, int* tasks, int numberOfProc, int numberOfTasks, int prPair, int prMut, int stop){
    sizeOfPop=_size;
    popNumber=0;
    probabilityPair=prPair;
    probabilityMut=prMut;
    globalIndNumber=0;
    stoppingCrit=stop;
    for(int i=0;i<sizeOfPop;i++){
        if(i==0) {
            Individual ind(tasks, numberOfTasks, numberOfProc, i);
            individual.push_back(ind);//ERROR IS HERE
            globalIndNumber++;
        }
        else {
            Individual ind(i);
            individual.push_back(ind);
            globalIndNumber++;
        }
    }
    int tmpNumber=0;
    for(int i=1;i<sizeOfPop;i++){
        if(individual[i].res<individual[tmpNumber].res) tmpNumber=i;
    }
    Population::bestIndiNumber=tmpNumber;
}
void Population::showPopulation(){
    cout<<"\nPopulation #"<<popNumber<<": ";
    for(int i=0; i<sizeOfPop; i++){
        if(i%4==0) cout<<endl;
        cout<<" ";
        individual[i].showInfo();
    }
    cout<<"\nBest individual :";
    individual[bestIndiNumber].showInfo();
    cout<<endl;
 
}
void Population::pairing(Individual &a, Individual &b){
    int chance=rand()%100;
    if(chance<this->probabilityPair){
        int pointOfCross=rand()%(Individual::DNAL-1)+1;
        Individual child1(a);
        child1.indNumber=++(this->globalIndNumber);
        Individual child2(b);
        child2.indNumber=++(this->globalIndNumber);
        for(int i=pointOfCross;i<Individual::DNAL;i++){
            swap(child1.gene[i],child2.gene[i]);
            swap(child2.cpuNumber[i],child1.cpuNumber[i]);
        }
        child1.calcCpuResults();
        child1.reFindResult();
        child2.calcCpuResults();
        child2.reFindResult();
        if(child1.res>child2.res){
            //delete child1
            chance=rand()%sizeOfPop;
            mutation(child2);
                if(child2.res<(this->individual[chance].res)) {
                    nextGeneration.push_back(child2);
                }
                else{ 
                    nextGeneration.push_back(individual[chance]);
                }
            }
        else {
            //delete child2
            mutation(child1);
            chance=rand()%sizeOfPop;
                if(child1.res<(this->individual[chance].res)) {
                    nextGeneration.push_back(child1);
                }
                else{ 
                    nextGeneration.push_back(individual[chance]);
                }
            }
    }
}
void Population::mutation(Individual &a){
    int chance=rand()%100;
    if(chance<(this->probabilityMut)){
        chance=rand()%Individual::DNAL;
        if((a.gene[chance]%2)==0) a.gene[chance]++;
        else a.gene[chance]--;
        int step=256/Individual::numberOfcpu;
        if(a.gene[chance]%step==0){
            a.cpuNumber[chance]=a.gene[chance]/step-1;
        }
        else a.cpuNumber[chance]=a.gene[chance]/step-1;
        a.calcCpuResults();
        a.reFindResult();
    }
}
void Population::calcBestIndiNumber(){
    int tmpNumber=0;
    for(int i=1;i<sizeOfPop;i++){
        if(individual[i].res<individual[tmpNumber].res) tmpNumber=i;
    }
    Population::bestIndiNumber=tmpNumber;
}
void Population::newGeneration(){
    for(int i=0;i<sizeOfPop;i++){
        int pairNum=rand()%sizeOfPop;
        while(pairNum==i) pairNum=rand()%sizeOfPop;
 
        pairing(individual[i],individual[pairNum]);
        this->calcBestIndiNumber();
    }
    popNumber++;
    this->calcBestIndiNumber();
    nextGeneration.swap(individual);
}
void Population::GA(){
    int sC=0;
    int lastBest=individual[bestIndiNumber].res;
    while(sC!=stoppingCrit){
        this->newGeneration();
        this->showPopulation();
        if(lastBest==individual[bestIndiNumber].res){
            sC++;
        }
        else{   
            lastBest=individual[bestIndiNumber].res;
        }
        nextGeneration.clear();
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2013, 23:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Vector subscript out of range (push_back, a не []) (C++):

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

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

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

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

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

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++; }...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.10.2013, 00:10 #2
SMYH, а если закомментить, в 22 строке будет такая же ошибка? Вообще странный if в цикле, его бы надо вынести из цикла и начинать цикл от единицы.
ct0r
Игогошка!
1769 / 671 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
24.10.2013, 00:19 #3
А какой вектор out of range? Я подозреваю, что не сам individual.
Я почти уверен, что ошибку надо искать в конструкторе копирования Individual. Там нужно внимательно посмотреть на индексы.
mat_for_c
141 / 136 / 29
Регистрация: 26.04.2013
Сообщений: 663
Завершенные тесты: 2
24.10.2013, 01:02 #4

Не по теме:

Цитата Сообщение от SMYH Посмотреть сообщение
Individual::Individual(int number){
* * indNumber=number;
* * int step=256/numberOfcpu;
numberOfcpu не определен



Добавлено через 5 минут

Не по теме:

но не в этом суть...

DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:13 #5
все верно. в конструкторе копировния косяки
C++
1
2
3
4
5
6
7
8
9
10
Individual::Individual(const Individual& p){
    for(int i=0;i<DNAL;i++){
        gene[i]=p.gene[i]; // тут gene - пустой вектор. gene[i] -проблема. с cpuNumber[i] - то же самое.
        cpuNumber[i]=p.gene[i];
    }
    res=p.res;
    for(int i=0;i<numberOfcpu;i++){
        cpuResult[i]=p.cpuNumber[i];
    }
}
наметанный глаз и без дебагера это сможет найти. а с дебагером подобное на раз ловится. осваивайте дебагер.
mat_for_c
141 / 136 / 29
Регистрация: 26.04.2013
Сообщений: 663
Завершенные тесты: 2
24.10.2013, 01:13 #6
Цитата Сообщение от ct0r Посмотреть сообщение
Я почти уверен, что ошибку надо искать в конструкторе копирования Individual.
Ага.

Цитата Сообщение от SMYH Посмотреть сообщение
for(int i=0;i<DNAL;i++){
* * * * gene[i]=p.gene[i];
* * * * cpuNumber[i]=p.gene[i];
* * }
* * res=p.res;
* * for(int i=0;i<numberOfcpu;i++){
* * * * cpuResult[i]=p.cpuNumber[i];
* * }
gene, cpuNumber, cpuResult - все пустые.
скорей всего через push_back надо сделать
ct0r
Игогошка!
1769 / 671 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
24.10.2013, 01:20 #7
Цитата Сообщение от mat_for_c Посмотреть сообщение
скорей всего через push_back надо сделать
Лучше через интервальные функции. assign, copy+inserter - что где нужно.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:21 #8
да вообще какой-то хитрый конструктор копирования.
cpuNumber[i]=p.gene[i]; - так задумано или это глюк. если так задумано - то это тоже глючная задумка.
если задумка была - полная копия один к одному - то тут и дефолтный, не надо свое писать, к тому
же еще и кривое. ну или если очень хочется покопировать руками - то сгодятся встроенные в вектора операторы =.
если они не подходят, потому что там в разное время значение статик членов разное - то это глюк дизайна.
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
24.10.2013, 01:24 #9
Цитата Сообщение от SMYH Посмотреть сообщение
Именно при пуше, не при операторе []
А по стандарту кидать исключение operator[] не обязан, должен лишь метод at.

Итераторы для кого придумали?
MastAKK
145 / 136 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
24.10.2013, 01:30 #10
Попробуйте делать вместо
C++
1
individual.push_back(ind);
сперва через resize(size); задать размер вектора, а потом делать
C++
1
individual.insert(i, ind);
Добавлено через 1 минуту
Хотя ладно, как я понял, ошибку уже нашли
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:33 #11
щас и у вас найдем. вместо ресайза наверно резерв нужен. и тогда такой инсерт не прокатит.
иначе, если все таки ресайз, то размер вектора окажется в два раза больше, что как-то не по феншую.
ct0r
Игогошка!
1769 / 671 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
24.10.2013, 01:40 #12
Цитата Сообщение от MastAKK Посмотреть сообщение
сперва через resize(size); задать размер вектора
Вызов кучи конструкторов по умолчанию не тру.

Цитата Сообщение от DU Посмотреть сообщение
щас и у вас найдем. вместо ресайза наверно резерв нужен. и тогда такой инсерт не прокатит.
иначе, если все таки ресайз, то размер вектора окажется в два раза больше, что как-то не по феншую.
Я не совсем понял. Под размеров вектора подразумевается емкость?
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:44 #13
нет. емкость это емкость - для этого reserve. размер - это количество элементов в векторе.
если сперва заресайзить вектор, а потом еще insert позвать, то количество элементов в векторе окажется несколько большим, чем ожидалось.
ct0r
Игогошка!
1769 / 671 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
24.10.2013, 01:50 #14
Цитата Сообщение от DU Посмотреть сообщение
если сперва заресайзить вектор, а потом еще insert позвать, то количество элементов в векторе окажется несколько большим, чем ожидалось.
Я понял, что я тогда неправильно понял, что вы сказали)
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 02:08 #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Individual::Individual(const Individual& p)
{
    for(int i=0;i<DNAL;i++)
    {
        //gene[i]=p.gene[i];
        gene.push_back(p.gene[i]);
        //cpuNumber[i]=p.gene[i];
        cpuNumber.push_back(p.cpuNumber[i]);
        
    }
    res=p.res;
    indNumber = p.indNumber;
    for(int i=0;i<numberOfcpu;i++)
    {
        //cpuResult[i]=p.cpuNumber[i];
        cpuResult.push_back(p.cpuResult[i]);
        
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2013, 02:08
Привет! Вот еще темы с ответами:

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

Ошибка: Vector subscript out of range - C++
Всю голову сломал, не вижу где ошибка...Выводит только первые 5 итераций, вместо 45... int ecc = 44; //Запись в массив...

expression vector subscript out of range - C++
Появляется ошибка при компиляции expression vector subscript out of range.Нужна помощь. Сортировка слиянием.Пользовался информацией с...

Ошибка vector subscript out of range - C++
Пишет &quot;vector subscript out of range&quot; Смысл этой задачи найти число с максимальной суммой делителей(всех) #include &lt;vector&gt; #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.10.2013, 02:08
Ответ Создать тему
Опции темы

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