我想将地图转换为矢量。
int main()
{
map <int,int> m;
m[0]=99;
m[1]=5;
vector<int> v;
transform( m.begin(), m.end(), back_inserter( v ), ??? );
}
我可以用什么功能从STL代替???。我做了很多谷歌搜索,但没有找到任何。
任何讨论都会有所帮助。
答案 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
中的最大键编号适合。用作键的最小数字必须大于或等于零。
答案 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。它更容易理解,并且像以前一样阻止你做出不必要的临时工作。