В моей программе есть класс, содержащий вектор целого типа. Он используется для хранения расстояний. У меня есть функция, которая при вызове должна устанавливать значения в векторе равными 0. (используется для инициализации). Но когда я иду, чтобы проверить размер вектора, он все еще говорит, что вектор пуст.
Я создал несколько функций, которые проверяют, добавляет ли вектор какие-либо элементы, и это не так. У меня есть функция, которую в main я вызываю, чтобы увидеть, пуст ли вектор, и она возвращает 0 (в векторе 0 элементов).
int MLB::getDistanceSize()
{
return distances.size();
}
void MLB::setInitialDistances(int size)
{
for(int i = 0; i < size; i++)
{
this->distances.push_back(0);
}
}
class MLB
{
public:
//constructor
MLB();
~MLB();
int getDistanceSize();
void setInitialDistances(int size);
private:
vector<int> distances;
};
Входной файл представляет собой файл csv, каждая строка которого состоит из:
стадион1,стадион2,расстояние
поэтому пример входного файла:
AT&T Park,Safeco Field,680
AT&T Park,Oakland–Alameda County Coliseum,50
Angel Stadium,Petco Park,110
Angel Stadium,Dodger Stadium,50
Busch Stadium,Minute Maid Park,680
Busch Stadium,Great American Ball Park,310
Busch Stadium,Target Field,465
Busch Stadium,Kauffman Stadium,235
и т.д...
Я использую qt, и здесь я вызываю сами функции. Вся информация хранится в карте, и другие геттеры работают отлично. Извините, что сделал это намного более запутанным, чем проблема на самом деле, любая помощь очень ценится.
// key and value, key is the team name, value is the MLB stadium information
struct entry
{
string key;
MLB value;
};
class Map
{
public:
//Public default constructor
Map();
//Public default destructor
~Map();
// returns entry of the map
entry atIndex(int index);
// Inserts a key and its value using linear algorithm
void insert(const string& theKey, const MLB& value);
private:
vector<entry> thisTable;
int currentSize; //Integer variable for current size
};
функции для карты:
Map::Map()
{
currentSize = 0;
}
Map::~Map()
{
}
void Map::insert(const string& theKey, const MLB& value)
{
entry thisEntry;
thisEntry.key = theKey;
thisEntry.value = value;
thisTable.push_back(thisEntry);
currentSize+=1;
}
entry Map::atIndex(int index)
{
return thisTable.at(index);
}
//mainwindow constructor
mainWindow::mainWindow()
{
//Reads in input from first csv file, all works fine all data stored and can access it
string iStadium1;
string iStadium2;
string iDistance;
string previous;
int distance;
int index1;
int index2;
bool found;
ifstream csvFile2;
csvFile2.open("inputDistance.csv");
getline(csvFile2, iStadium1, ',');
while(!csvFile2.eof())
{
index1 = 0;
found = false;
while(!found)
{
if(thisMap.atIndex(index1).value.getStadiumName() == iStadium1)
{
thisMap.atIndex(index1).value.setInitialDistances(thisMap.mapSize());
cout << "Distance Size Test 1: " << thisMap.atIndex(index1).value.getDistanceSize() << endl;
found = true;
}
else
{
index1++;
}
}
previous = iStadium1;
while(iStadium1 == previous)
{
getline(csvFile2, iStadium2, ',');
getline(csvFile2, iDistance, '\n');
distance = stoi(iDistance);
index2 = 0;
found = false;
while(!found)
{
if(thisMap.atIndex(index2).value.getStadiumName() == iStadium2)
{
found = true;
cout << "Distance Size Test 2: " << thisMap.atIndex(index1).value.getDistanceSize() << endl;
// crashes here. Index out of bounds, size is 0 for some reason
thisMap.atIndex(index1).value.setDistance(index2, distance);
}
else
{
index2++;
}
}
getline(csvFile2, iStadium1, ',');
}
}
csvFile2.close();
}
Я ожидаю, что вектор будет содержать 30 слотов (при условии, что желаемый размер, переданный в функцию, равен 30) со значением 0, а не пустой вектор.
thisMap.atIndex(index1).value
, вы не получаете каждый раз один и тот же объект. - person john   schedule 08.04.2019thisMap
иatIndex
. - person john   schedule 08.04.2019atIndex
. - person john   schedule 08.04.2019atIndex
, я надеюсь, что это можно быстро прояснить. - person john   schedule 08.04.2019entry& Map::atIndex(int index) { return thisTable.at(index); }
- person john   schedule 08.04.2019atIndex
не возвращает запись на вашей карте, она возвращает копию записи на вашей карте. Измените его, чтобы вернуть ссылку (см. два комментария выше). - person john   schedule 08.04.2019