如果我创建一个向量并用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算法呢?
谢谢!
答案 0 :(得分:2)
由于你实际上没有说出你得到的错误,我们必须猜测解决方案。另外,鉴于this test code works,我认为你必须在其他地方犯错。
您是否收到运行时错误,例如分段错误?如果是这样,那么问题将是您尝试填充的向量,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);
答案 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));