2016-06-28 74 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