【问题标题】:no matching function for call to 'std::vector<std::vector<int> >::push_back(int)'没有调用 'std::vector<std::vector<int> >::push_back(int)' 的匹配函数
【发布时间】:2021-02-20 16:56:24
【问题描述】:

我制作了一个向量向量,我想从用户那里获取值。我只是不知道它有什么问题

为什么我不能在这里使用push_back() 如果您有任何其他方法,请告诉。

vector<vector<int>>  v;
for(int i=0;i<n;i++)
{
   v.push_back(i+1);
   for(int j=0;j<n;j++)
    {
        v[i].push_back(j+1);
    }
}

这样做会出错

error: no matching function for call to 'std::vector<std::vector<int> >::push_back(int)'
v.push_back(i+1);

【问题讨论】:

  • 你想通过这个语句 v.push_back(i+1); 达到什么目的?
  • 向量 v 不包含整数,因此您不能在第 4 行推回一个整数。例如,您可以推回一个空向量,或者您可以在循环之前使用调整大小。
  • 谢谢先生,我现在完全明白了。

标签: c++ vector


【解决方案1】:

您声明了std::vector&lt;std::vector&lt;int&gt;&gt; 类型的向量。

vector<vector<int>>  v;

这意味着向量v 的元素的类型是std::vector&lt;int&gt; 而不是int

因此编译器会针对该语句发出错误消息

v.push_back(i+1);

这没有意义。

如果类模板 std::vector 具有从整数表达式到类型 std::vector 的隐式收缩器,则可以使用这样的调用。但是这样的构造函数是显式的

explicit vector(size_type n, const Allocator& = Allocator());

因此,没有从提供给参数n 的参数表达式到类型std::vector&lt;int&gt; 的隐式转换。

你的意思好像是下面这个

vector<vector<int>>  v;
for(int i=0;i<n;i++)
{
   v.resize(i+1);
   for(int j=0;j<n;j++)
    {
        v[i].push_back(j+1);
    }
}

【讨论】:

  • 关于 v.resize(i+1) - 只是 vector&lt;vector&lt;int&gt;&gt; v(n); 大声哭泣。
【解决方案2】:

这是因为 v 是一个包含整数向量的向量。这意味着您不能 push_back 一个整数,因为它需要一个 int 向量。

vector<vector<int>>  v;
for(int i=0;i<n;i++)
{
    vector<int> v2;
    for(int j=0;j<n;j++)
    {
        v2.push_back(j+1);
    }
    v.push_back(v2);
}

现在考虑这段代码,它会起作用,因为您正在创建一个新的整数向量 v​​2。如果你将 v2 推送到 v,它会起作用,因为 v 需要一个 int 向量作为 push_back。

【讨论】:

    【解决方案3】:

    人们在回答时喜欢把事情弄得过于复杂。这里的想法是您在向量中创建了一个向量。所以第一个向量接受一个向量作为输入,而第二个向量接受一个“int”。因此,您不应该在 first 向量中压入整数,而应在整数的 VECTOR 中压入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2020-07-06
      • 2012-06-18
      相关资源
      最近更新 更多