C++中的重复结构

Duplicate Struct in C++

本文关键字:结构 C++      更新时间:2023-10-16

如何将一个struct复制到另一个。目前,以下代码可以编译,但在运行时仍会崩溃。有更好的方法吗?

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;
    }
    }

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;
    }
}

您的Tripfeed声明应该是

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

如果你有一个不错的编译器,可以使用基于范围的for循环:

#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());
}

使用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;
    }
  }