使用std :: begin()和std :: end()从数组构造向量

时间:2013-10-14 23:04:31

标签: c++ c++11 stl

我在尝试构建vector

时遇到错误
int data[] = { 1, 2, 3, 4, 4, 3, 7, 8, 9, 10 }; // source
std::vector<int> vv(data, data + 10); // ok 
std::vector<int> vv(std::begin(data), std::end(data + 10)); // Error

GCC输出:

  

main.cpp:59:61:错误:没有匹配函数来调用'end(int *)'

 std::vector<int> vv(std::begin(data), std::end(data + 10));

为什么我收到此错误?

3 个答案:

答案 0 :(得分:9)

由于+ 10导致错误,导致array of Tpointer to T的衰减。有一个std::end重载需要(引用)一个数组,但是不是一个用于获取指针。

只需使用:std::vector<int> vv(std::begin(data), std::end(data));

或者,只需使用:

std::vector<int> vv{1, 2, 3, 4, 4, 3, 7, 8, 9, 10};

...并完全跳过使用数组。

答案 1 :(得分:0)

通常在不知道大小时在数组上使用std::end。定义std::end使得它将推导出大小并返回指向该偏移量的指针:

std::vector<int> v(begin(data), end(data));

答案 2 :(得分:-3)

考虑到你也可以使用算法std :: iota将向量的元素设置为递增的数字序列。

例如

const size_t N = 20;

std::vector<int> v( N );

std::iota( v.begin(), v.end(), 1 );