所以我有这张地图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> > >
我的副本现在有效。谢谢你们
答案 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; });