错误:没有用于调用“std::vector<float>::push_back(std::vector<float>&) const”的匹配函数

时间:2021-02-01 13:53:52

标签: c++ dictionary vector

我正在尝试将地图 (m) 值复制到向量 (v) 中

地图是这样声明的:

const map<int, vector<float> >& m = ....;

我试过了:

const vector<float>& v;
for(auto elem : m)
  v.push_back(elem.second);

我收到此错误:

错误:没有匹配的函数调用'std::vector::push_back(std::vector&) const'

4 个答案:

答案 0 :(得分:2)

您这样做的目的有点不清楚,但是如果您想制作一个 vector<float> 来保存 map 中所有向量中的所有值,您可以这样做,但您不能直接 push_back 一个 vector<float>,这是您收到错误的原因之一:

error: no matching function for call to 'std::vector::push_back(std::vector&) const'

您可以一个一个地push_back float 值 - 或者使用 vector::insert 成员函数一次性插入所有元素(看起来您正在尝试这样做)。

另一个原因是 vconst 这意味着它被初始化后,你不能对其进行更改。

一些注意事项:

  • 您已将 mapvector 创建为 const&。这有效并延长了您以这种方式创建的临时 mapvector 的生命周期 - 但作为 const 您无法更改它们中的任何一个。我建议您至少删除 vector 上的引用,并将其设为非 const,以便能够填充它。

示例:

#include <map>
#include <vector>

int main() {
    const std::map<int, std::vector<float>> m { {1, {2,3,4}} };

    std::vector<float> v;

    for(auto& elem : m) {
        // insert the vector values from this map-entry at the end of `v`
        v.insert(v.end(), elem.second.begin(), elem.second.end());
    }
}

注意 auto& elem 而不是 auto elem。后者复制数据(这可能很昂贵),而 auto& elem 通过引用获取数据。

使用结构化绑定,填充循环如下所示:

    for(auto&[first, second] : m) {
        v.insert(v.end(), second.begin(), second.end());
    }

答案 1 :(得分:0)

您的地图类型是:int, vector<float> 这意味着您的值是 vectorfloats 类型。 你的向量有浮点型。 您不能在向量的一个元素中 push_back 浮点向量。 你需要这样做。

vector<float> v;
for(auto elem : m)
{
    for(auto f : elem.second)
        v.push_back(f);
}

或类似的东西取决于你想如何使用你的价值观。

答案 2 :(得分:0)

您试图将一个向量推到一个向量上,这是没有意义的。对象不能是其自身的元素。

改为:

const map<int, float>& m = ....;

for(auto elem : m)
{
   int i = 0;

   while(i < elem.second.size())
   {
      v.push_back(elem.second[i]);

      i += 1;
   }
}

答案 3 :(得分:-1)

你试图将 VECTOR 推到 vector 你需要 Vector of Vector 才能工作 你的元素是向量,变量 v 是一个向量你需要 vector

相关问题