创建向量时的默认值C ++

时间:2017-03-12 04:02:41

标签: c++ vector

请考虑以下代码:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    // create a vector with 20 0s
    std::vector<int> arr(20);
    for (int i = 0; i < arr.size(); i++)
        std::cout<<arr[i];
    return 0;
}

上面的代码创建了一个20 0的矢量并打印出每个矢量。如果我将构造函数更改为arr (20,1),则会创建一个20 1 s。

的向量

如果我定义一个类:

class Rectangle {
    int width, height;
  public:
    Rectangle (int,int);
    int area () {return (width*height);}
};

Rectangle::Rectangle (int a, int b) {
  width = a;
  height = b;
}

创建一个Rectangle s而不是int s的向量:

int main() {
    // create a vector with 20 integer elements
    std::vector<Rectangle> arr(20, Rectangle(2,2));
    for (int i = 0; i < arr.size(); i++)
        std::cout<<arr[i].area();
    return 0;
}

二十4张印刷。但是,当我尝试:

std::vector<Rectangle> arr(20);

我明白了:

prog.cpp: In constructor 'std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type, const value_type&, const allocator_type&) [with _Tp = Rectangle; _Alloc = std::allocator<Rectangle>; std::vector<_Tp, _Alloc>::size_type = unsigned int; std::vector<_Tp, _Alloc>::value_type = Rectangle; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<Rectangle>]':
prog.cpp:19:34: error: no matching function for call to 'Rectangle::Rectangle()'
     std::vector<Rectangle> arr(20);

我是否需要定义一个没有参数的构造函数才能使其工作?一般来说,当我使用非基本类型时,当我不向vector构造函数提供第二个参数时会发生什么?

2 个答案:

答案 0 :(得分:3)

  

我是否需要定义一个没有参数的构造函数才能使其工作?

是的,请看这个链接: http://en.cppreference.com/w/cpp/container/vector/vector

以下是std::vector的相关构造函数。

  

显式向量(size_type count,                    const T&amp; value = T(),                    const Allocator&amp; alloc = Allocator());

如果没有第二个参数,则通过default parameter假定为T() 在您的情况下,T()将成为Rectangle()

当您使用std::vector调用基元时,它的行为类似 粗略地说,它将在原语上调用 default-constructor -syntax,例如int(),产生0。

This ideone demo显示int()==0

答案 1 :(得分:2)

对你的参数化构造函数进行一点修改可以解决问题。 我们必须在这里提供默认参数。

Rectangle::Rectangle (int a=1, int b=1){
        width = a;
        height = b;
}

现在,如果我们调用std::vector arr(20);,它将正确执行并提供您想要的输出。