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

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

Восстановить пароль Регистрация
 
SMYH
 Аватар для SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
23.10.2013, 23:26     Vector subscript out of range (push_back, a не []) #1
При попытке сделать 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 не [])
Посмотрите здесь:

expression vector subscript out of range C++
vector subscript out of range C++
C++ Vector subscript out of range
C++ Ошибка: Vector subscript out of range
C++ Vector subscript out of range
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.10.2013, 00:10     Vector subscript out of range (push_back, a не []) #2
SMYH, а если закомментить, в 22 строке будет такая же ошибка? Вообще странный if в цикле, его бы надо вынести из цикла и начинать цикл от единицы.
ct0r
C++/Haskell
 Аватар для ct0r
1550 / 569 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
24.10.2013, 00:19     Vector subscript out of range (push_back, a не []) #3
А какой вектор out of range? Я подозреваю, что не сам individual.
Я почти уверен, что ошибку надо искать в конструкторе копирования Individual. Там нужно внимательно посмотреть на индексы.
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 586
Завершенные тесты: 2
24.10.2013, 01:02     Vector subscript out of range (push_back, a не []) #4

Не по теме:

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



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

Не по теме:

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

DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:13     Vector subscript out of range (push_back, a не []) #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
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 586
Завершенные тесты: 2
24.10.2013, 01:13     Vector subscript out of range (push_back, a не []) #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
C++/Haskell
 Аватар для ct0r
1550 / 569 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
24.10.2013, 01:20     Vector subscript out of range (push_back, a не []) #7
Цитата Сообщение от mat_for_c Посмотреть сообщение
скорей всего через push_back надо сделать
Лучше через интервальные функции. assign, copy+inserter - что где нужно.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:21     Vector subscript out of range (push_back, a не []) #8
да вообще какой-то хитрый конструктор копирования.
cpuNumber[i]=p.gene[i]; - так задумано или это глюк. если так задумано - то это тоже глючная задумка.
если задумка была - полная копия один к одному - то тут и дефолтный, не надо свое писать, к тому
же еще и кривое. ну или если очень хочется покопировать руками - то сгодятся встроенные в вектора операторы =.
если они не подходят, потому что там в разное время значение статик членов разное - то это глюк дизайна.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
24.10.2013, 01:24     Vector subscript out of range (push_back, a не []) #9
Цитата Сообщение от SMYH Посмотреть сообщение
Именно при пуше, не при операторе []
А по стандарту кидать исключение operator[] не обязан, должен лишь метод at.

Итераторы для кого придумали?
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
24.10.2013, 01:30     Vector subscript out of range (push_back, a не []) #10
Попробуйте делать вместо
C++
1
individual.push_back(ind);
сперва через resize(size); задать размер вектора, а потом делать
C++
1
individual.insert(i, ind);
Добавлено через 1 минуту
Хотя ладно, как я понял, ошибку уже нашли
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:33     Vector subscript out of range (push_back, a не []) #11
щас и у вас найдем. вместо ресайза наверно резерв нужен. и тогда такой инсерт не прокатит.
иначе, если все таки ресайз, то размер вектора окажется в два раза больше, что как-то не по феншую.
ct0r
C++/Haskell
 Аватар для ct0r
1550 / 569 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
24.10.2013, 01:40     Vector subscript out of range (push_back, a не []) #12
Цитата Сообщение от MastAKK Посмотреть сообщение
сперва через resize(size); задать размер вектора
Вызов кучи конструкторов по умолчанию не тру.

Цитата Сообщение от DU Посмотреть сообщение
щас и у вас найдем. вместо ресайза наверно резерв нужен. и тогда такой инсерт не прокатит.
иначе, если все таки ресайз, то размер вектора окажется в два раза больше, что как-то не по феншую.
Я не совсем понял. Под размеров вектора подразумевается емкость?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:44     Vector subscript out of range (push_back, a не []) #13
нет. емкость это емкость - для этого reserve. размер - это количество элементов в векторе.
если сперва заресайзить вектор, а потом еще insert позвать, то количество элементов в векторе окажется несколько большим, чем ожидалось.
ct0r
C++/Haskell
 Аватар для ct0r
1550 / 569 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
24.10.2013, 01:50     Vector subscript out of range (push_back, a не []) #14
Цитата Сообщение от DU Посмотреть сообщение
если сперва заресайзить вектор, а потом еще insert позвать, то количество элементов в векторе окажется несколько большим, чем ожидалось.
Я понял, что я тогда неправильно понял, что вы сказали)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 02:08     Vector subscript out of range (push_back, a не []) #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, 06:28     Vector subscript out of range (push_back, a не [])
Еще ссылки по теме:

Vector subscript out of range C++
Vector subscript out of range при удалении C++
Vector subscript out of range C++

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

Или воспользуйтесь поиском по форуму:
SMYH
 Аватар для SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
24.10.2013, 06:28  [ТС]     Vector subscript out of range (push_back, a не []) #16
Да, спасибо, ребята. Ошибка в конструкторе копирования. Не знаю, каким образом, я его так написал. Можно закрывать
Yandex
Объявления
24.10.2013, 06:28     Vector subscript out of range (push_back, a не [])
Ответ Создать тему
Опции темы

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