对初始化的向量

问题描述 投票:-2回答:1

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

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的结构)

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

c++ vector constructor initialization std-pair
1个回答
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;
}

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

© www.soinside.com 2019 - 2024. All rights reserved.