2016-06-28 3 views
-3

Как я могу копировать один struct в другой. В настоящее время следующий код компилируется, но продолжает сбой во время выполнения. Есть лучший способ сделать это?Дубликат Struct в C++

struct Trip 
{ 
    int startX; 
    int startY; 
    int endX; 
    int endY; 
    int suppress 
}; 

struct Feedback 
{ 
    int startX; 
    int startY; 
    int endX; 
    int endY; 
    int suppress; 
}; 

vector<Trip> tripList; 
vector<Trip> TTMx[288]; 
TTMX[0] = &tripList; 
vector<Feedback> Tripfeed[288]; 

    for(time = 0; time < 288; time++){ 
      for (int trp=0; trp < tripList.size(); trp++) { 

       Tripfeed[time][trp].startX = tripList[trp].startX; 
       Tripfeed[time][trp].startY = tripList[trp].startY; 
       Tripfeed[time][trp].endX = tripList[trp].endX; 
       Tripfeed[time][trp].endY = tripList[trp].endY; 
       Tripfeed[time][trp].suppress = tripList[trp].suppress; 
    } 
    } 
+4

У вас есть массив из 288 пустых векторов. Чтобы добавить элементы к одному вектору, используйте 'push_back'. –

+0

Как использовать push_back для добавления данных в объект startX? – Far

+1

Что такое 'tripList'? вы должны иметь возможность использовать этот один оператор внутри своих циклов «Tripfeed [time] .push_back (tripList [trp])' –

ответ

0

Tripfeed объявлен как массив 288 пустых векторов , Они пусты, потому что это поведение конструктора по умолчанию для векторного класса. Он выходит из строя из-за нарушения доступа при попытке доступа к элементам этих векторов, поскольку векторы пусты. Для каждого вектора вы должны изменить его размер до желаемого размера до доступа к его элементам. Вот правильный код:

struct Feedback 
{ 
    int startX; 
    int startY; 
    int endX; 
    int endY; 
    int suppress; 
}; 

vector<Feedback> Tripfeed[288]; 

for(time = 0; time < 288; time++) 
{ 

    Tripfeed[time].resize (tripList.size()); 

    for (int trp=0; trp < tripList.size(); trp++) 
    { 
     Tripfeed[time][trp].startX = tripList[trp].startX; 
     Tripfeed[time][trp].startY = tripList[trp].startY; 
     Tripfeed[time][trp].endX = tripList[trp].endX; 
     Tripfeed[time][trp].endY = tripList[trp].endY; 
     Tripfeed[time][trp].suppress = tripList[trp].suppress; 
    } 
} 
+0

Спасибо, миллион! Обычно я предпочитаю push_back, поэтому мне не нужно изменять размер, однако я должен был это понять. – Far

+0

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

0

ваша декларация Tripfeed должна быть

vector<vector<Feedback>> Tripfeed(288, vector<Feedback>(tripList.size(), Feedback())); 
0

Если у вас есть приличный компилятор с диапазоном на основе цикла доступного:

#include <algorithm> 

// ... 

for (std::vector<Feedback>& f : Tripfeed) 
{ 
    f.resize(tripList.size()); // all vectors in Tripfeed are initially empty 
    std::copy(tripList.begin(), tripList.end(), f.begin()); 
} 
0

использовать resize(), чтобы выделить достаточное количество памяти для вектора. ваш код должен выглядеть примерно так. Тем не менее, я рекомендую использовать 2D-векторы для объявления Tripfeed (std :: vector < std :: vector < Обратная связь>> Tripfeed).

for(int time = 0; time < 288; time++){ 
    Tripfeed[time].resize(tripList.size()); 
    for (int trp=0; trp < tripList.size(); trp++) { 
     Tripfeed[time][trp].startX = tripList[trp].startX; 
     Tripfeed[time][trp].startY = tripList[trp].startY; 
     Tripfeed[time][trp].endX = tripList[trp].endX; 
     Tripfeed[time][trp].endY = tripList[trp].endY; 
     Tripfeed[time][trp].suppress = tripList[trp].suppress; 
    } 
    } 
+0

Спасибо! Это было глупое упущение с моей стороны. – Far