如何构造具有构造函数参数的对象向量?

时间:2014-01-27 22:58:23

标签: c++ vector

我想做类似的事情:

class Circle {
    int radius;
    public:
        Circle( int r ) : radius(r) {}     
}

vector<Circle> circlesVector;

for (int i = 0; i < 10; i++) {
    Circle circle(i);
    circlesVector.push_back(circle);
}

但这似乎并不像我想要的那样有效。向量尝试使用Circle(Circle&amp;)的构造函数或某些我不理解或期望的行为来创建Circle对象。

5 个答案:

答案 0 :(得分:9)

您发布的代码基本上没问题,只有一些拼写错误和遗漏包含。您可以看到this working demo

但您不需要创建临时Circle对象。你可以这样做:

for (int i = 0; i < 10; i++) {
    circlesVector.push_back(i);
}

因为Circle可以隐式构建int。 请注意,您还可以使用初始化列表:

vector<Circle> circlesVector{0,1,2,3,4,5,6,7,8,9};

或者,使用emplace_back

circlesVector.emplace_back(i);

答案 1 :(得分:3)

Class Circle有一个转换构造函数,它将int类型的对象转换为Circle类型的对象:

Circle( int r ) : radius(r) {}  

所以你可以使用这个构建向量的事实

for (int i = 0; i < 10; i++) {
    circlesVector.push_back( i );
}

答案 2 :(得分:1)

你可以利用你提供的转换构造函数,因此Circle可以隐式构造int

for (int i = 0; i < 10; i++) {
    circlesVector.push_back(i);
}

会没事的。但是,如果构造函数中有许多变量,您可以使用ie std::transform

Circle initC ( Circle c) {
    static int i = 0;
    return Circle(i++); // copy assignment operator
}                       // will be used to assign new Circle into default
                        // version of Circle present already in vector
int main(int argc, char *argv[])
{
    std::vector<Circle> cVec(10);
    std::transform( cVec.begin(), cVec.end(),
                    cVec.begin(), initC);

    return 0;
}

答案 3 :(得分:0)

你也可以通过创建一个临时的半径矢量来完成所有这些操作:

Example

class Circle 
{
private:
    int radius;
public:
        Circle( int r ) : radius(r) {}     

        int GetRadius() const { return radius; }
};

int main() 
{
    std::vector<int> radii(10); // vector to hold your radiuses
    std::iota(radii.begin(), radii.end(), 0); // initialize them to the desired sizes
    std::vector<Circle> circles(radii.begin(), radii.end()); // use your conversion constructor
    for (std::size_t i = 0; i < circles.size(); ++i)
    {
        std::cout << "Circle[" << i << "] radius = " << circles[i].GetRadius() << "\n";
    }
    return 0;
}

答案 4 :(得分:0)

“向量尝试使用Circle(Circle&amp;)的构造函数或某些我不理解或期望的行为来创建Circle对象。” STL容器(至少使用C ++ 98)复制您添加到它们的构造对象。