C++ 如何迭代映射并将其转化为向量?

C++ 如何迭代映射并将其转化为向量?,c++,algorithm,C++,Algorithm,我有一张c++的地图: #include <bits/stdc++.h> using namespace std; int main() { map <int,int> map; int k; cin >> k; for (int i = 0; i < k; i++) { int m; cin >> m; map.at(m)++; }

我有一张c++的地图:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    map <int,int> map;
    int k;
    cin >> k;

    for (int i = 0; i < k; i++)
    {
        int m;
        cin >> m;
        map.at(m)++;
    }      
}
#包括
使用名称空间std;
int main()
{
地图;
int k;
cin>>k;
for(int i=0;i>m;
图.at(m)+;
}      
}
如何迭代此映射并将其所有值添加到vector

所以地图看起来像这样:

pair<int, int>(1, 40)
pair<int, int>(22, 30)
pair<int, int>(34, 60)
pair<int, int>(41, 20)
pair<int, int>(5, 50)
pair<int, int>(6, 50)
pair<int, int>(7, 10)
配对(1,40)
配对(22,30)
配对(34,60)
配对(41,20)
一对(5,50)
配对(6,50)
配对(7,10)

我想把它的值推到向量上。所以向量看起来是这样的:[40,30,60,20,50,50,10]

使用
std::copy
不是最好的主意,因为映射的
值类型是
std::pair
,向量的类型是
int
,所以我将使用
std::for\u each
,它允许您以特定的方式进行复制

std::for_each

例如:

std::map;
std::vec;
...
std::for_each(map.begin()、map.end()、[&vec](常量自动对){
向量推回(成对第二);
});
std::transform

std::transform(map.begin(),map.end(),std::back_inserter(vec),[](const auto pair){return pair.second;});

使用
std::copy
不是最好的主意,因为映射的
值类型是
std::pair
,向量的值是
int
,因此我将使用
std::for_each
,它允许您以特定的方式进行复制

std::for_each

例如:

std::map;
std::vec;
...
std::for_each(map.begin()、map.end()、[&vec](常量自动对){
向量推回(成对第二);
});
std::transform

std::transform(map.begin(),map.end(),std::back_inserter(vec),[](const auto pair){return pair.second;});
给你

#include <iostream>
#include <vector>
#include <map>

std::vector<int> map_to_vector( const std::map<int, int> &m )
{
    std::vector<int> v;
    v.reserve( m.size() );

    for ( const auto &p : m )
    {
        v.push_back( p.second );
    }

    return v;
}

int main() 
{
    std::map<int, int> m =
    {
        { 1, 40 }, { 22, 30 }, { 34, 60 }, { 41, 20 }, { 5, 50 }, { 6, 50 }, { 7, 10 }
    };

    auto v = map_to_vector( m );

    for ( const auto &item : v )
    {
        std::cout << item << ' ';
    }
    std::cout << '\n';

    return 0;
}
请注意,地图是按其键排序的。因此,向量将按照映射中键的顺序包含值

或者,正如Jerry Jeremiah在评论中所写,您可以使用标准算法
std::transform

std::vector<int> map_to_vector( const std::map<int, int> &m )
{
    std::vector<int> v;
    v.reserve( m.size() );

    std::transform( std::begin( m ), std::end( m ), std::back_inserter( v ),
                    []( const auto &p ) { return p.second; } );
    return v;
}
std::vector映射到向量(const std::map&m)
{
std::向量v;
v、 储备量(m.size());
std::transform(std::begin(m)、std::end(m)、std::back_插入器(v),
[](const auto&p){return p.second;});
返回v;
}
给你

#include <iostream>
#include <vector>
#include <map>

std::vector<int> map_to_vector( const std::map<int, int> &m )
{
    std::vector<int> v;
    v.reserve( m.size() );

    for ( const auto &p : m )
    {
        v.push_back( p.second );
    }

    return v;
}

int main() 
{
    std::map<int, int> m =
    {
        { 1, 40 }, { 22, 30 }, { 34, 60 }, { 41, 20 }, { 5, 50 }, { 6, 50 }, { 7, 10 }
    };

    auto v = map_to_vector( m );

    for ( const auto &item : v )
    {
        std::cout << item << ' ';
    }
    std::cout << '\n';

    return 0;
}
请注意,地图是按其键排序的。因此,向量将按照映射中键的顺序包含值

或者,正如Jerry Jeremiah在评论中所写,您可以使用标准算法
std::transform

std::vector<int> map_to_vector( const std::map<int, int> &m )
{
    std::vector<int> v;
    v.reserve( m.size() );

    std::transform( std::begin( m ), std::end( m ), std::back_inserter( v ),
                    []( const auto &p ) { return p.second; } );
    return v;
}
std::vector映射到向量(const std::map&m)
{
std::向量v;
v、 储备量(m.size());
std::transform(std::begin(m)、std::end(m)、std::back_插入器(v),
[](const auto&p){return p.second;});
返回v;
}


什么的向量?要添加到向量的数据是什么?你自己试过什么?你自己的尝试有什么问题?另外,请花一些时间阅读,以及。现在检查askOn另外两个注释,您当前显示的代码将不起作用,因为该函数不会向地图添加新元素。相反,它将抛出一个异常。另外,请阅读。它不编译
bez-nazwy.cpp:17:50:错误:从类型为'std::vector::iterator{aka uu-gnu\u-cxx::'uu-normal\u-iterator}'的右值中初始化类型为“\uu-gnu-cxx::”的非常量引用无效。
std::map
按键排序,在你的例子中,对不是按第一个元素排序的。结果向量中元素的顺序重要吗?什么向量?要添加到向量的数据是什么?你自己试过什么?你自己的尝试有什么问题?另外,请花一些时间阅读,以及。现在检查askOn另外两个注释,您当前显示的代码将不起作用,因为该函数不会向地图添加新元素。相反,它将抛出一个异常。另外,请阅读。它不编译
bez-nazwy.cpp:17:50:错误:从类型为'std::vector::iterator{aka uu-gnu\u-cxx::'uu-normal\u-iterator}'的右值中初始化类型为“\uu-gnu-cxx::”的非常量引用无效。
std::map
按键排序,在你的例子中,对不是按第一个元素排序的。结果向量中元素的顺序是否重要?或者std::transform如何使用std transform?
cpp std::map;std::vector vec。。。std::transform(map.begin()、map.end()、std::back_插入器(vec),[](常量自动对){return pair.second;})或std::transform如何使用std transform?
cpp std::map;std::vector vec。。。std::transform(map.begin()、map.end()、std::back_插入器(vec),[](常量自动对){return pair.second;})好的,很好用,为什么我不能对这个自动v排序?@michel我不明白你的意思。可以对向量进行排序。问题是什么?我得到了这个错误
bez-nazwy.cpp:35:26:错误:调用'sort(,std::vector::iterator')时没有匹配的函数
@michel-std::sort(std::begin(v),std::end(v));为什么排序(v.begin(),v.end())不起作用
?当然,我使用的是名称空间std;好的,很好用,为什么我不能对这辆汽车进行分类?米歇尔,我不明白你的意思。可以对向量进行排序。问题是什么?我得到了这个错误
bez-nazwy.cpp:35:26:错误:调用'sort(,std::vector::iterator')时没有匹配的函数
@michel-std::sort(std::begin(v),std::end(v));为什么排序(v.begin(),v.end())不起作用
?当然,我使用的是名称空间std;