1

我想将地图转换为矢量。

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

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

我可以从 STL 中使用哪个功能来代替 ???。我做了很多谷歌搜索,但没有找到任何东西。

任何讨论都会有所帮助。

4

3 回答 3

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())提前致电以避免重新分配。

于 2013-10-25T11:22:57.917 回答
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

于 2013-10-25T13:39:17.017 回答
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。我原来的答案是错误的,因为我写了 pair<int, bool> 而不是 pair<const int, bool>。这个错误显示了 typedef 的重要性:如果你使用

typedef map<int, bool> MyMapT;

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

于 2013-10-25T11:25:40.177 回答