2012-10-24 45 views
-1

如果我创建了一个载体,与这些结构的64填补它像这样向量和结构

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

我怎么能现在使用的算法类型不是int,双,字符串等工作。?

让我们看看fill_n算法。如果你有

vector<int> someOtherVector(64); 

我们可以填补像这样

fill_n (someOtherVector.begin(),64,20); 

如果我尝试这与我的movementType载体,我得到一个错误

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

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

谢谢!

+0

哪里是'fill_n()'定义和/或它做了什么? –

+1

@SamIam'std :: fill_n'是C++标准库中的一种算法。 –

+3

如果您遇到错误,请不要只是这么说,请告诉您发生了什么错误。这会有很大的帮助。 –

回答

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? 
    } 
}; 
+1

在这种情况下,无需提供赋值运算符。编译器生成一个很好。 – juanchopanza

+0

编译器将生成一个'movementType :: opeartor =(const moveType&)',但不会生成'movementType :: operator =(int)'(尽管我首先编写了'movementType :: operator =(const movementType&)',然后编辑它)。 – user1610015

+1

@ user1610015:你为什么认为他需要一个转换赋值运算符?问题中没有什么让我觉得这是必要的。 –

0

我的猜测是,你需要提供一个构造函数,以您的结构,这在C++中的行为非常喜欢的一类。 Somethink像

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

我非常怀疑这与问题有关。 –

+0

@MooingDuck你能否详细说明一下? – rpsml

+0

他似乎已经正确构建并初始化'movementType'。他似乎在用'运动类型'对象填充'矢量'。 –

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

提问者提到它适用于'vector ',但不适用于'vector '。 –

+0

@sftrabbit:是的,'fill_n(someOtherVector.begin(),64,20);'会正常工作。 –

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