与向量和结构一起工作

Working with vectors and structs

本文关键字:一起 工作 结构 向量      更新时间:2023-10-16

如果我创建了一个向量并将其填充64个这些结构,例如So

struct movementType { int x, y , moves;};
vector<movementType> myVector(64);

现在,该类型不是int,double,string等,我该如何使用算法?

让我们采用fill_n算法。如果您有

vector<int> someOtherVector(64);

我们可以像这样

填充它
fill_n (someOtherVector.begin(),64,20);

如果我使用MovemtType向量尝试此操作,我会发现一个错误

MovementType empty;
empty.x = 5;
empty.y = 6;
empty.moves = 7;
fill_n (someOtherVector.begin(),64,empty);

那么如何在我的向量中使用这些类型的STL算法?

谢谢!

由于您实际上没有说出什么错误,因此我们必须对解决方案进行猜测。另外,鉴于此测试代码有效,我认为您必须在其他地方犯错。

您是否遇到运行时错误,例如分段故障?如果是这样,那么问题将是您要填充的向量,someOtherVector中没有足够的元素。您实际上将其定义为std::vector<movementType> someOtherVector(64)或仅将其定义为std::vector<movementType> someOtherVectorstd::fill_n将给定值分配给您要填充的容器的每个元素,因此,如果没有元素,则有问题。因此,请确保您的向量中有足够的元素。

这里的替代方法是使用 std::back_inserter将元素添加到空的向量:

std::vector<movementType> someOtherVector;
std::fill_n(std::back_inserter(someOtherVector), 64, empty);

但是,您真的应该做:

std::vector<movementType> someOtherVector(64, empty);

fill_n (someOtherVector.begin(),64,empty);毫无意义,您正在尝试用 movementType填充 vector<int>。如果要填充vector<movementType>,则以下操作(假设您已经声明为vector<movementType> myVector(64);):

在C 11中:

fill_n(myVector.begin(), 64, movementType{1, 2, 3});

或C 03:

movementType m = {1, 2, 3};
fill_n(myVector.begin(), 64, m);

您可以为您的类编写操作员,以使其像您要使用的算法的原始类型一样,或者,如果算法采用函数对象执行操作,则写一个lambda或函子类并将其传递到算法。

在这种情况下,操作员是operator=

struct movementType
{
    int x;
    int y;
    int moves;
    movementType& operator=(int i)
    {
        // which member do you want to assign "i" to?
    }
};

我的猜测是,您需要为您的结构提供一个构造函数,在C 中,该结构的行为几乎就像一类。像

一样
struct movementType 
{ 
  movementType(int X, int Y, int Moves) : x(X), y(Y), moves(Moves) { }  // Constructor with 3 int's
  movementType(const movementType &MT) : x(MT.x), y(MT.y), moves(MT.moves) { } // Copy constructor
  int x, y , moves; 
};

然后使用

fill_n(someOtherVector.begin(),64, movementType(5,6,7));