2016-06-28 75 views
-3

我該如何去複製一個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個空載體的數組。它們是空的,因爲這是vector類的默認構造函數的行爲。當您嘗試訪問這些向量的元素時,它會因訪問衝突而崩潰,因爲向量是空的。對於每個矢量,在訪問其元素之前,必須將其調整到所需的大小。以下是正確的代碼:

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 < Feedback>> 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