![](/img/trans.png)
[英]map<string, vector <pair<int, int> > > pushing back into pair?
[英]Transfer map<string, pair> to vector
所以我有這張地圖
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> > >
現在我的副本可以了。 感謝大伙們
一種簡單的方法是創建具有所有三個字段的結構:
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()
和自定義比較函數來更改順序。
這是一個有點昂貴的解決方案,它通過引用映射來對字符串列表進行排序:
// 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; });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.