19

我的代码有问题吗?

std::vector<int[2]> weights;
int weight[2] = {1,2};
weights.push_back(weight);

无法编译,请帮忙解释一下原因:

no matching function for call to ‘std::vector<int [2], std::allocator<int [2]> >::push_back(int*&)’
4

9 回答 9

35

数组不能在 STL 容器中使用的原因是因为它要求类型是可复制构造和可分配的(在 c++11 中也可移动构造)。例如,您不能对数组执行以下操作:

int a[10];
int b[10];
a = b; // Will not work!

因为数组不满足要求,所以不能使用。但是,如果您确实需要使用数组(可能并非如此),您可以将其添加为类的成员,如下所示:

struct A { int weight[2];};
std::vector<A> v;

但是,如果您使用std::vectoror可能会更好std::array

于 2012-06-15T04:16:44.653 回答
4

你不能简单地做到这一点。

最好使用以下任何一种:

  1. vector <vector<int>>(它基本上是一个二维向量。它应该适用于你的情况)

  2. vector< string >(字符串是一个字符数组,因此您需要稍后进行类型转换。这很容易。)。

  3. 您可以声明一个结构(例如 S),其中包含int 类型数组,即

    struct S{int a[num]},然后声明向量 vector< S>

因此,间接地将数组推入向量。

于 2012-06-15T03:54:33.417 回答
4

数组也可以像这样添加到容器中。

    int arr[] = {16,2,77,29};
    std::vector<int> myvec (arr, arr + sizeof(arr) / sizeof(int) );

希望这可以帮助某人。

于 2015-12-26T18:21:27.813 回答
3

数组不是可复制构造的,因此您不能将它们存储在容器中(vector在这种情况下)。您可以存储嵌套的vector或在 C++11 中的 a std::array

于 2012-06-15T04:11:50.573 回答
2

您应该使用std::array而不是简单的数组:

#include <vector>
#include <array>

std::vector<std::array<int, 2>> weights;
std::array<int, 2> weight = {1, 2};
weights.push_back(weight);

或使用构造函数:

std::vector<std::array<int, 2>> weights;
weights.push_back(std::array<int, 2> ({1, 2});
于 2019-12-15T20:55:52.877 回答
2

一种可能的解决方案是:

    std::vector<int*> weights;
    int* weight = new int[2];
    weight[0] =1; weight[1] =2;
    weights.push_back(weight);
于 2020-01-29T15:28:26.580 回答
0

只需使用

vector<int*>  .That will definitely work.

关于同一主题的相关讨论:将数组推入向量

于 2012-06-15T03:56:08.910 回答
0

情况如:

int arr[3] = { 1, 2, 3 };
std::vector<int[]> v;
v.push_back(arr);

不适用于错误“无法使用 .. 初始化向量中的数组”

这,可以很好地工作

int * arr = new int[3] { 1, 2, 3 };
std::vector<int*> v;
v.push_back(arr);
于 2021-08-16T10:57:15.107 回答
-2

要实例化向量,您需要提供一个类型,但 int[2] 不是类型,它是一个声明。

于 2012-06-15T04:16:59.490 回答