Вектор теряет данные после вставки

Вот проблема:
У меня есть класс с именем ‘state’, в котором хранится вектор типа int. В моей программе я создаю вектор состояния, но после этого, когда я пытаюсь получить значения вектора int, кажется, что он просто пуст. Я создал файл .cpp, чтобы проверить это:

state.h:

#ifndef STATE_H
#define STATE_H

#include <vector>

class state {
public:
std::vector<int> vectorstate;
~state();
state();
state(state &sta);
state(const state &sta);
state & operator= (const state &sta);
bool operator==(const state &sta) const;
};

#endif

state.cpp:

#include "state.h"using namespace std;

state::~state(){
}

state::state(){
}

state::state(state &est){
for(int i=0;i<vectorstate.size();i++)
vectorstate[i] = est.vectorstate[i];
}

state::state(const state &est){
for(int i=0;i<vectorstate.size();i++)
vectorstate[i] = est.vectorstate[i];
}

state & state::operator= (const state &est) {
if (this == &est) return *this;
for(int i=0;i<vectorstate.size();i++)
vectorstate[i] = est.vectorstate[i];
return *this;
}

bool state::operator==(const state &est) const {
for(int i=0;i<vectorstate.size();i++)
if(vectorstate[i] != est.vectorstate[i])
return false;
return true;
}

main.cpp (для целей тестирования):

#include <iostream>
#include <algorithm>
#include <vector>
#include "state.h"using namespace std;

int main(){
state before, after;
for(int i=0;i<9;i++)
before.vectorstate.push_back(i);
for(int i=0;i<before.vectorstate.size();i++)
cout << before.vectorstate[i] << " ";
cout << endl << endl;
for(int i=3;i<12;i++)
after.vectorstate.push_back(i);
for(int i=0;i<after.vectorstate.size();i++)
cout << after.vectorstate[i] << " ";
cout << endl << endl;
vector<state> vetor;
vetor.push_back(before);
vetor.push_back(after);
for(int i=0;i<vetor[0].vectorstate.size();i++)
cout << vetor[0].vectorstate[i] << " ";
cout << endl;
for(int i=0;i<vetor[1].vectorstate.size();i++)
cout << vetor[1].vectorstate[i] << " ";
cout << endl;
state aux;
aux = vetor.front();
for(int i=0;i<aux.vectorstate.size();i++)
cout << aux.vectorstate[i] << " ";
return 0;
}

И этот вывод:

http://i.imgur.com/A60K72e.jpg

(Извините за ссылку, я не смог опубликовать изображение здесь, думаю, из-за репутации).

Итак, как вы можете видеть, я пытался по-разному получить доступ к этому вектору int, но он не дал мне никакого результата, любая помощь будет очень признательна!

1

Решение

Проблема заключается в вашей реализации конструктора копирования и оператора присваивания.

state & state::operator= (const state &est) {
if (this == &est) return *this;
for(int i=0;i<vectorstate.size();i++)
vectorstate[i] = est.vectorstate[i];
return *this;
}

Если vectorstate из this в настоящее время пусто, то vectorstate.size() вернусь 0 и содержимое цикла for никогда не будет выполнено. Внутри ваших конструкторов копирования и оператора присваивания убедитесь, что вы скопировали полный вектор (std::vector имеет конструктор рабочей копии).

Или, что еще лучше, не реализуйте их, и пусть сгенерированный компилятором конструктор копирования и присваивание сделают всю работу.

2

Другие решения

Я переработал твой код «немного» и вуаля:

state.cpp

#include <algorithm>
#include "state.h"
using namespace std;
state::state() {}
state::state(const state &est) : vectorstate(est.vectorstate) {}
state & state::operator= (const state &est) {
if (this == &est) return *this;
vectorstate.resize(est.vectorstate.size());
std::copy(est.vectorstate.begin(), est.vectorstate.end(), vectorstate.begin());
return *this;
}
bool state::operator==(const state &est) const { return est.vectorstate == vectorstate; }

state.h

    #ifndef STATE_H
#define STATE_H

#include <vector>

struct state {
std::vector<int> vectorstate;
state();
state(const state &sta);
state & operator=(const state &sta);
bool operator==(const state &sta) const;
};
#endif

Причины / Bugs:

  1. Вы портили вещи в своем конструкторе копий. vectorstate пусто после вызова конструктора копирования, поэтому не может копировать элементы по нижнему индексу.
  2. Вы все испортили в своем операторе присваивания. Вы должны сначала изменить размер вектора, а затем скопировать элементы другого объекта.
  3. В вашем операторе равенства применяется == Оператор на векторах достаточно.
0

По вопросам рекламы [email protected]