我正在尝试将地图 (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'
答案 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
成员函数一次性插入所有元素(看起来您正在尝试这样做)。
另一个原因是 v
是 const
这意味着它被初始化后,你不能对其进行更改。
一些注意事项:
map
和 vector
创建为 const&
。这有效并延长了您以这种方式创建的临时 map
和 vector
的生命周期 - 但作为 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>
这意味着您的值是 vector
的 floats
类型。
你的向量有浮点型。
您不能在向量的一个元素中 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