2016-04-14 7 views
0

Я пытаюсь управлять массивом структур с использованием векторов, но продолжать получать сообщение об ошибке.Как использовать векторы C++ с пользовательской структурой?

Вектор объявлен в заголовочном файле как:

vector< TLE_Values, allocator<TLE_Values> > SavedSatellites; 

который VS2013 вполне доволен.

Структура определяется как:

struct TLE_Values 
{ 
    string CatalogNum; 
    string SatelliteName; 
    string DateStr; 
    string TimeStr; 
    string Classification; 
    double DecayValue; 
    int ElsetNum; 
    double InclinationValue; 
    double RaanValue; 
    double EccentricityValue; 
    double ArgPerigeeValue; 
    double PerigeeAngle; 
    double AvgSpeed; 
    double Period;    
    int OrbitNum; 
}; 

и инициализируется со значениями по умолчанию конструктором.

В основном коде программы, определив количество элементов I потребует (CountItemsInFile()), я пытаюсь расширить список вектора с помощью:

SavedSatellites.push_back(CountItemsInFile()); 

Это, однако, возвращает следующее сообщение об ошибке компилятора:

error C2664: 
'void std::vector<TLE_Values,std::allocator<TLE_Values>>::push_back(const TLE_Values &)' : cannot convert argument 1 from 'int' to 'TLE_Values &&' 
1>   Reason: cannot convert from 'int' to 'TLE_Values' 
1>   No constructor could take the source type, or constructor overload resolution was ambiguous. 

Другой поток предположил, что вектор необходимо инициализирован с 0, что не будет происходить с определенным пользователем типа, как это. Что мне не хватает? где я пошла не так? Как создать исходный вектор с моей структурой? Существует множество документации по использованию векторов типа (int), но не так много, если вы не используете целые числа.

ответ

1

The docs являются ключевыми здесь:

void push_back (const value_type& val); 

push_back не принимает int, он принимает параметр того же типа ваш vector держит. Вы должны дать ему объект TLE_Values.

Вы также не должны упреждающим образом изменять размер vector; вы можете просто позвонить push_back, пока не закончите.

+1

Ор возможно хочет «изменить размер()». –

+0

Согласен, но я не думаю, что они * нужны *. Кажется, они запутались в настройке «vector» для вставки и стараются ее размер до заполнения. Надеюсь, мое редактирование разъясняет это для них. – computerfreaker

+0

@computerfreaker, если вы знаете размер, который вы всегда должны изменять, иначе вы просто тратите средства ... – BeyelerStudios

3

Чтобы развернуть вектор использования

SavedSatellites.resize(CountItemsInFile()); 

Если вы хотите просто резервную память для него, но сохранить размер вектора нетронутыми и готовы к последующему push_back без перераспределения памяти:

SavedSatellites.reserve(CountItemsInFile()); 
Смежные вопросы