c ++ vector生成函数类对象

时间:2017-05-29 15:40:57

标签: c++ vector stl

我必须使用'生成'在向量上运行以创建10个对象。我有一个带有构造函数的类:

Point(){
        this->x=rand()%100;
        this->y=rand()%100;
};

然后我创建一个向量并使用' generate'功能:

vector<Point> v (10);
generate (v.begin(), v.end(), Point());

当我编译它时,我收到此错误:

Type 'Point' does not provide a call operator

我不知道为什么。

3 个答案:

答案 0 :(得分:3)

看起来你想用Point的默认构造实例填充向量。

在回答您的实际问题之前,调用std::generate是不必要的,因为v已经有10个默认构造的Point实例。

但是如果你真的想要调用它,std::generate期望Generator为一个函数对象,即一个operator()的对象。 Point没有,编译器会抱怨。传递lambda是个好主意,因为它们是这样的函数对象:

std::generate(v.begin(), v.end(), []() {
    return Point{};
});

答案 1 :(得分:2)

生成器函数的原型描述为here。它必须是一个返回下一个要生成的值的函数。您正在传递Point的单个默认构造实例。也许你试图提供Point的构造函数作为生成器函数,但是构造函数不符合要求(它不会返回任何东西),永远不应该直接调用它,&#&#&# 39;永远无法获得地址(你也不能得到一个地址)。

您必须提供一个单独返回点的函数。最简单的方法是传递std::generate lambda函数。你会做这样的事情:

std::vector<Point> v(10);
std::generate(v.begin(), v.end(), []() { return Point{}; });

但请注意,行std::vector<Point> v(10);已经创建了10个默认构造的Point个对象。由于您的随机化逻辑在您的默认构造函数中,因此在这种情况下使用std::generate是多余的。

答案 2 :(得分:0)

你需要一个生成积分的功能

Point RandomPoint() { return Point(); }

int main(int argA, char** argV)
{
    vector<Point> v(10);

    generate(v.begin(), v.end(), RandomPoint);

    return  0;
}