首页 > 解决方案 > 谁能帮我提高这个功能的效率

问题描述

所以我试图通过一个 unordered_map 容器进行排序。容器从一个文件中读取输入,该文件是人员列表。文件中的每一行都会像rCB, bIA,这将作为一个元素存储在地图中。每个元素中的第二个字符串充当指向列表中下一个人的指针,因此稍后它将再次出现在新行中,在这种情况下:bIA,TDV.

到目前为止,我可以通过创建一个 unordered_map 迭代器并使用 find 函数中的第二个字符串让迭代器转到下一个元素来按顺序进行排序。我的问题是另一种方式。我能够以相反的方式进行排序,但我实施解决方案的方式意味着最终排序需要很长时间,因为我们有 300 万人的输入文件。

list<string> SortEast(unordered_map<string, string> &TempUMap, unordered_map<string, string>::iterator IT, list<string> &TempList)
{
    IT = TempUMap.begin();
    while (TempList.size() != (TempUMap.size() + 1))
    {
        if (IT->second == TempList.front())
        {
            TempList.emplace_front(IT->first);
            IT = TempUMap.begin();
        }
        IT++;
    }
    return TempList;
}

我试图提高效率,但我想不出如何。如果我能找到将在列表开头的值,我可以从该值开始按顺序排序,但我也不知道如何轻松找到该值。

任何帮助,将不胜感激。

编辑:我们的一个输入样本是:

rBC,biA vnN,CmR CmR,gnz Dgu,OWn lnh,Dgu OWn,YMO YMO,SIZ XbL,Cjj TDV,jew iVk,vnN wTb,rBC jew,sbE sbE,iVk Cjj,wTb AGn,XbL gnz,SMz biA,TDV SIZ,uvD SMz,lnh

这只有20人。在这种情况下AGn,是第一个值,uvD也是最后一个值。我最终得到的输出是:

AGn XbL Cjj wTb rBC biA TDV jew sbE iVk vnN CmR gnz SMz lnh Dgu OWn YMO SIZ uvD

由于此文件以 开头rBC,这就是我需要向后排序的点

标签: c++unordered-map

解决方案


你能不能简单地做这样的事情:

vector<string> orderAllTheNames(const unordered_map<string, string>& input, const string& begin)
{
  vector<string> result;
  result.reserve(input.size());
  string current = begin;

  result.push_back(current);
  while(result.size() < input.size())
  {
    current = input[current];
    result.push_back(std::move(current));
  }
  return result;
}

当我在手机上输入此内容时,我可能错过了一些细节。如果您担心飞来飞去的副本太多,您可以添加一些指针和/或 std::moves。

我想这与您的解决方案相同,但没有尴尬的列表和 emplace_front。


推荐阅读