有人可以帮我理解这段代码是如何工作的吗?
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的结构)
据我所知,它将每一对放在一个单独的数组中,但我以前从未见过这种声明。
答案 0 :(得分:1)
类模板std::vector
具有构造函数
template <class InputIterator>
vector(InputIterator first, InputIterator last, const Allocator& = Allocator());
因此在此声明中
vector<Pair> arr(a, a + n);
使用了这个构造函数。 a
和a + 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;
}
其输出与上面显示的相同。