对初始化的向量

时间:2017-12-02 23:57:35

标签: c++ vector constructor initialization std-pair

有人可以帮我理解这段代码是如何工作的吗?

Pair a[] = {{5, 29}, {39, 40}, {15, 28}, {27, 40}, {50, 90}};
int n = sizeof(a)/sizeof(a[0]);
vector<Pair> arr(a, a + n);

(Pair是具有两个整数a和b的结构)

据我所知,它将每一对放在一个单独的数组中,但我以前从未见过这种声明。

1 个答案:

答案 0 :(得分:1)

类模板std::vector具有构造函数

template <class InputIterator>
vector(InputIterator first, InputIterator last, const Allocator& = Allocator());

因此在此声明中

vector<Pair> arr(a, a + n); 

使用了这个构造函数。 aa + n指定范围[a, a + n )。此范围内的元素用于初始化矢量。

至于此声明

Pair a[] = {{5, 29}, {39, 40}, {15, 28}, {27, 40}, {50, 90}};

然后它是一个数组的声明,其中每个元素都使用一个大括号列表进行初始化。似乎用户定义的类型Pair是聚合或具有接受两个参数的构造函数。

这是一个示范程序

#include <iostream>
#include <vector>

struct Pair
{
    int x;
    int y;
};

int main() 
{
    Pair a[] = 
    { 
        {5, 29}, {39, 40}, {15, 28}, {27, 40}, {50, 90} 
    };

    size_t n = sizeof( a ) / sizeof( a[0] );

    std::vector<Pair> arr(a, a + n);

    for ( const Pair &p : arr )
    {
        std::cout << "{ " << p.x 
                  << ", " << p.y
                  << " }" << ' ';
    }

    std::cout << std::endl;

    return 0;
}

它的输出是

{ 5, 29 } { 39, 40 } { 15, 28 } { 27, 40 } { 50, 90 }

而不是这些陈述

    size_t n = sizeof( a ) / sizeof( a[0] );

    std::vector<Pair> arr(a, a + n);
你可以写

std::vector<Pair> arr( std::begin( a ), std::end( a ) );

这是另一个示范程序

#include <iostream>
#include <vector>
#include <iterator>

struct Pair
{
    int x;
    int y;
};

int main() 
{
    Pair a[] = 
    { 
        {5, 29}, {39, 40}, {15, 28}, {27, 40}, {50, 90} 
    };

    std::vector<Pair> arr( std::begin( a ), std::end( a ) );

    for ( const Pair &p : arr )
    {
        std::cout << "{ " << p.x 
                  << ", " << p.y
                  << " }" << ' ';
    }

    std::cout << std::endl;

    return 0;
}

其输出与上面显示的相同。