【问题标题】:Using std::begin() and std::end() to construct vector from array使用 std::begin() 和 std::end() 从数组构造向量
【发布时间】:2013-10-14 23:04:30
【问题描述】:

我在尝试构造向量时遇到错误

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));

为什么我会收到此错误?

【问题讨论】:

  • std::end 的重点是您不必输入“随机”+ 10。请记住,您可以使用初始化列表初始化向量。
  • @chris false,请参阅下面的答案
  • @newprint:嗯,不,这才是重点。在不明确提及容器或数组的边界的情况下获取容器或数组的结尾。

标签: c++ c++11 stl


【解决方案1】:

由于+ 10,您会收到错误,这会导致从array of T 衰减到pointer to T。有一个 std::end 重载来获取(引用)一个数组,但不是一个来获取指针。

只需使用:std::vector&lt;int&gt; vv(std::begin(data), std::end(data));

或者,只需使用:

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

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

【讨论】:

  • false,检查家具模板 T* begin( T (&array)[N] );
  • @newprint:你试过了吗?您是否将编译器设置为接受 C++11?
  • 设置为C++11,但是你写的有问题。 std::end(data) 不携带任何信息到终点!与其他容器类型不同,数组没有.size()。你无法推断它的大小!!
  • @newprint 插图:sizeof(array) 给出了整个数组的大小(以字节为单位)。获取元素数量有一个老技巧:sizeof(array) / sizeof(array[0])。数组类型确实携带有关它包含的元素数量的信息。数组不是指针。
  • @littleadv 我想我们只是在谈论不同的事情。当然,您不能在动态分配的数组上使用std::end,因为在编译时您可能没有大小信息。但是,std::end 适用于任何数组类型的参数。
【解决方案2】:

当您不知道大小时,通常在数组上使用std::endstd::end 被定义为它会推断出大小并返回指向该偏移量的指针:

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

【讨论】:

  • s/不知道/不想重复/
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 2016-02-08
相关资源
最近更新 更多