与向量和结构一起工作
Working with vectors and structs
如果我创建了一个向量并将其填充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> 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);
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));
- 如何使我的 sizeof sum 结构与空参数包一起工作
- SFINAE:它如何与派生类一起工作?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 尝试让条形码扫描仪与Arduino一起工作
- 从书本中学习C++无法使该程序与类一起工作
- 让类与运算符一起工作更简单的方法
- 如何使lambda与std::nullopt一起工作
- 当我使用长整型时,我的代码不起作用,它与 int 一起工作得很好
- 返回对象如何与分配运算符一起工作
- GLM :: perspective()和glm :: lookat()一起工作
- SFML OpenGL:如何同时与他们一起工作
- 使QTConcurrent ::映射与Lambdas一起工作
- 如何与C 字符串中的非ASCII字符一起工作
- 我如何适应擦除式习惯与矢量元组一起工作
- 需要帮助使 VOID 代码与总工资一起工作
- 我怎样才能让这个刽子手代码与 wxDev-C++ 一起工作
- Googletest 在 bazel test 中永远不会失败(在它应该失败的地方),但与 cmake & clion 一起工作
- 常量变量初始化仅与成员初始化列表一起工作
- feal_ptr与unique_ptr一起工作
- OpenGL Ping Pong可与一张通行证一起工作,而不是两个通行证