我想将地图转换为矢量。
int main()
{
map <int,int> m;
m[0]=99;
m[1]=5;
vector<int> v;
transform( m.begin(), m.end(), back_inserter( v ), ??? );
}
我可以从 STL 中使用哪个功能来代替 ???。我做了很多谷歌搜索,但没有找到任何东西。
任何讨论都会有所帮助。
要么使用 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())
提前致电以避免重新分配。
这是一个示例,说明如何将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
我想这就是你需要的(在 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。我原来的答案是错误的,因为我写了 pair<int, bool> 而不是 pair<const int, bool>。这个错误显示了 typedef 的重要性:如果你使用
typedef map<int, bool> MyMapT;
您可以将类型写为 MyMapT::value_type,而不是普通的地图定义。它更容易理解,并防止你像我以前那样做不必要的临时工。