将地图<string,pair =“”>传输到矢量

时间:2016-09-26 23:06:48

标签: c++ dictionary vector

所以我有这张地图m

typedef pair<int,int>p;
map<string, p> m;

它包含文本文件中的所有单词,对中的第一个int是单词的频率,第二个是文本文件中第一个字符的位置。这些都是计算出来的,地图工作正常。

无论其

我需要打印这些单词,按频率按降序排序。我需要位置计数器,因为如果两个单词具有相同的频率,则文件中首先出现的单词应该位于列表中的第一位。

如何将此地图转换为矢量?

我试过

   copy(m.begin(), m.end(), back_inserter(wordList));

无济于事

+++++++++++++++++++++++++++++++++++++++++++++++ +++++

好的所以我把wordList更改为vector<pair<string, pair<int, int> > > 我的副本现在有效。谢谢你们

2 个答案:

答案 0 :(得分:2)

简单的方法是创建一个包含所有三个字段的结构:

struct Record
{
  std::string word;
  int         count;
  std::streampos file_position;
};

接下来是遍历地图,创建上述结构的实例,填充它们并附加到向量:

std::vector<Record> database;
for (map<string,p>::const_iterator iter = m.begin();
     iter != m.end();
     ++iter)
{
  Record r;
  r.word = iter->first;
  r.count = iter->second.first;
  r.file_position = iter->second.second;
  database.push_back(r);
}

现在填充了矢量,按顺序排序。可以使用std::sort()和自定义比较功能更改订单。

答案 1 :(得分:0)

这是一个有点昂贵的解决方案,它通过引用地图对字符串列表进行排序:

// Make word list
std::vector<std::string> words;
words.reserve(m.size());
for (const auto & p : m) words.push_back(p.first);

// Sort
std::sort(
    words.begin(), words.end(),
    [&m](const std::string & lhs, const std::string & rhs)
    { return m.find(lhs)->second < m.find(rhs)->second; });