【问题标题】:Transfer map<string, pair> to vector将 map<string, pair> 转移到向量
【发布时间】:2016-09-27 07:20:43
【问题描述】:

所以我有这张地图m

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

它保存一个文本文件中的所有单词,第一个 int 是单词的频率,第二个是它的第一个字符在文本文件中的位置。这些都是经过计算的,地图工作正常。

但是

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

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

我试过了

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

无济于事

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

好的,所以我已将 wordList 更改为 vector&lt;pair&lt;string, pair&lt;int, int&gt; &gt; &gt; 我的副本现在可以工作了。谢谢各位

【问题讨论】:

  • 什么是wordlist?您是否收到编译错误或运行时问题?你得到什么错误?我们可以猜测,但如果你告诉我们会更好。
  • 它已经在地图中按字典顺序排序,将其移动到向量不会神奇地改变顺序。
  • 如果wordListstd::vector&lt;std::pair&lt;std::string, std::pair&lt;int, int&gt; &gt; &gt;,则该副本将起作用。否则你需要做一些工作将地图中的数据映射成可以存储到向量的形式。
  • 你真的需要一个向量吗,我认为对于你提出的问题来说,构造一个频率到单词的 std::multimap 会更好。
  • 道歉。 wordList 是我目前正在尝试使用的向量。它是向量。它给了我 100 多个关于指针和不同事物的错误,我认为我误用了这些容器。我也需要按数字排序,而不是按字母顺序

标签: c++ dictionary vector


【解决方案1】:

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

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() 和自定义比较功能更改顺序。

【讨论】:

    【解决方案2】:

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

    // 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; });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多