簡體   English   中英

轉移地圖 <string, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM