使用向量和结构

时间:2012-10-24 19:49:51

标签: c++

如果我创建一个向量并用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);

如果我使用我的movingType矢量尝试此操作,则会出现错误

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

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

谢谢!

4 个答案:

答案 0 :(得分:2)

由于你实际上没有说出你得到的错误,我们必须猜测解决方案。另外,鉴于this test code works,我认为你必须在其他地方犯错。

您是否收到运行时错误,例如分段错误?如果是这样,那么问题将是您尝试填充的向量,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);

答案 1 :(得分: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);

答案 2 :(得分:0)

您可以为您的类编写运算符,使其行为类似于您要使用的算法的基本类型,或者,在算法使用函数对象执行操作的情况下,编写lambda或functor类并传递它适用于算法。

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

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

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

答案 3 :(得分: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));