-1

如果我创建一个向量并用 64 个这样的结构填充它

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

如果我用我的 motionType 向量尝试这个​​,我会得到一个错误

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

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

谢谢!

4

4 回答 4

2

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

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

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

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

但是,你真的应该这样做:

std::vector<movementType> someOtherVector(64, empty);
于 2012-10-24T20:15:43.527 回答
1

fill_n (someOtherVector.begin(),64,empty);没有多大意义,你正试图vector<int>用你的movementType. 如果您想填写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);
于 2012-10-24T20:02:15.170 回答
0

我的猜测是你需要为你的结构提供一个构造函数,它在 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));
于 2012-10-24T19:57:32.947 回答
0

您可以为您的类编写运算符,使其行为类似于您要使用的算法的原始类型,或者,在算法采用函数对象执行操作的情况下,编写 lambda 或仿函数类并将其传递给算法。

在这种情况下,运算符是operator=

struct movementType
{
    int x;
    int y;
    int moves;

    movementType& operator=(int i)
    {
        // which member do you want to assign "i" to?
    }
};
于 2012-10-24T19:54:32.853 回答