【问题标题】:vector of pair initialization对初始化向量
【发布时间】:2017-12-02 23:57:34
【问题描述】:

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

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

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

【问题讨论】:

  • 什么是Pair?你到底有什么不明白的?你熟悉vector吗?你检查过vector 的文档吗?

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


【解决方案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;
}

其输出与上图相同。

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多