如何使用变换函数模板将地图转换为矢量

时间:2013-10-25 11:20:31

标签: c++ stl

我想将地图转换为矢量。

int main()
{
    map <int,int> m;
    m[0]=99;
    m[1]=5;

    vector<int> v;
    transform( m.begin(), m.end(), back_inserter( v ), ??? );
}

我可以用什么功能从STL代替???。我做了很多谷歌搜索,但没有找到任何。

任何讨论都会有所帮助。

3 个答案:

答案 0 :(得分:2)

使用lambda:

transform(m.begin(), m.end(), back_inserter(v),
         [](pair<const int, bool> const & p) { return p.second; });

或者使用简单的循环:

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

或者使用旧式循环:

for (map<int, bool>::const_iterator it = m.begin(); it != m.end(); ++it)
{ v.push_back(it->second); }

在任何情况下,请事先致电v.reserve(m.size())以避免重新分配。

答案 1 :(得分:1)

以下是一个示例,说明如何在bool中将std::vector值存储在用作std::map中的键的无序索引中(有点像哈希桶。)

std::vector<bool> v(m.rbegin()->first + 1, false);
for (auto& p : m) {
    v[p.first] = p.second;
}

std::vector将使用尽可能多(错误)的值进行初始化,以便std::map中的最大键编号适合。用作键的最小数字必须大于或等于零。

实例: http://ideone.com/5VQFmr

答案 2 :(得分:0)

我想这就是你所需要的(在C ++ 11中):

auto transformer = [] (const pair<const int, bool>& value) {
  return value.second;
};

transform( m.begin(), m.end(), back_inserter( v ), transformer);

如果你想编写自己的仿函数类,你可以避免使用C ++ 11 lambda,但是operator()的参数应该是相同的。

UPD。我的原始回答是错误的,因为我写了一对&lt; int,bool&gt;而不是对&lt; const int,bool&gt;。这个错误显示了typedef的重要性:如果你使用了

typedef map<int, bool> MyMapT;

而不是普通的地图定义,您可以将类型写为MyMapT :: value_type。它更容易理解,并且像以前一样阻止你做出不必要的临时工作。