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

How do I construct a vector of objects that have constructor arguments?

本文关键字:构造函数 参数 对象 向量 何构建 构建      更新时间:2023-10-16

我想做类似的事情:

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

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

您发布的代码在根本上很好,栏一些错别字和缺少。您可以看到此工作演示。

,但您无需创建临时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);

class Circle具有一个转换构造函数,该转换构造函数将类型INT对象转换为类型circle的对象:

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

因此,您可以使用以下事实来构建向量

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

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

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

很好。但是,如果构造函数中有许多变量,则可以使用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;
}

您还可以通过创建一个临时向量的Radiuses来完成所有操作:

示例:

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

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