【问题标题】:Can i push an array of int to a C++ vector?我可以将 int 数组推送到 C++ 向量吗?
【发布时间】:2012-06-15 03:44:37
【问题描述】:

我的代码有问题吗?

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*&)’

【问题讨论】:

  • 这适用于std::arrays、std::vectors 或std::pairs 的向量。您的数组在传入时会衰减为指针,这会导致问题。
  • 谢谢,克里斯。我明白了。
  • 我认为有一个很好的答案等待提出它为什么不起作用的所有细节,我会发现这是一本有趣且有启发性的读物。它不仅仅是腐烂,但我不确定那里有什么。
  • 这可以使用移动语义在 C++11 中工作吗?还是这也注定了?
  • @templatetypedef,即使解决了推入,也存在复制之类的其他问题。不过,我不完全确定它是否适用于推送。

标签: c++ stdvector


【解决方案1】:

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

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

因为数组不满足要求,所以不能使用。但是,如果您真的需要使用数组(可能不是这种情况),您可以将其添加为类的成员,如下所示:

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

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

【讨论】:

    【解决方案2】:

    一种可能的解决方案是:

        std::vector<int*> weights;
        int* weight = new int[2];
        weight[0] =1; weight[1] =2;
        weights.push_back(weight);
    

    【讨论】:

      【解决方案3】:

      你应该使用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});
      

      【讨论】:

        【解决方案4】:

        你不能简单地这样做。

        最好使用以下任何一种:

        1. vector &lt;vector&lt;int&gt;&gt;(它基本上是一个二维向量。它应该适用于您的情况)

        2. vector&lt; string &gt;(字符串是一个字符数组,所以你需要稍后进行类型转换。这很容易。)。

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

          struct S{int a[num]},然后声明向量 vector&lt; S&gt;

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

        【讨论】:

        • 为什么是字符串?问题是关于成对的ints。
        • 你使用字符串吗? Y 不是向量?
        • 不,向量的向量(int)。字符串用于保存字符。他想保存整数。
        • 你也可以这样做..但字符串也可以是一个选项..此外,类型转换不是问题..
        • 在糟糕的程序员领域...一切皆有可能!有一次我看到一个通用容器实现,其中字符串的字符存储为浮点数。
        【解决方案5】:

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

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

        希望这对某人有所帮助。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 语句std::vector&lt;int[2]&gt; weights;std::vector&lt;int*&gt; weights; 是否等效?
          • 不,它们命名不同的类型,并且此时数组不会降级为指针。
          【解决方案7】:

          随便用

          vector<int*>  .That will definitely work.
          

          同一主题的相关讨论:Pushing an array into a vector

          【讨论】:

          • 它会编译。我不认为它会做任何人理性想做的事情!如果数组在堆栈上,您的解决方案将崩溃​​。
          • 你能告诉我为什么不?我只是尝试了一个简单的例子,它按预期工作。向量只是存储数组的起始地址。所以,如果你想访问第n个元素,只需在向量上查找,然后到第n个位置。
          • @Arvind:对。一切正常,直到数组离开范围,或者您期望制作vector 的副本会产生深层副本。然后奇怪的事情开始发生。
          • 我说错了。如果数组超出范围,现在您的向量中有一个指向随机内存的指针。
          • @Managu,@Steven -是的,我也意识到了这一点。应该在答案中提到这一点。如果有人在 stl 容器中使用原始指针,他们最好先可视化内存布局! :-)
          【解决方案8】:

          情况如下:

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

            • int[2] 是一种类型。它是一个由 2 个整数组成的数组。数组也是类型,只是没有其他语言那么强大。
            • 如果是类型,声明不就是int[2] myvar;吗?
            • @RogerDahl:你会这么认为,但不是。您可以创建接受int[2] 作为类型(example)的模板,只是类型不符合std::vector 的要求。所以不能在那里使用。
            猜你喜欢
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            • 1970-01-01
            • 2022-08-18
            • 2021-11-24
            • 2021-11-13
            • 2010-11-18
            • 1970-01-01
            相关资源
            最近更新 更多