c++ - 谁能帮我提高这个功能的效率
问题描述
所以我试图通过一个 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
,这就是我需要向后排序的点
解决方案
你能不能简单地做这样的事情:
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。
推荐阅读
- java - 为具有非默认构造函数和依赖注入的类创建 Mockito 测试
- javascript - 如何在组件中呈现动态 HTML?
- twitter-bootstrap - Twitter Bootstrap 应该支持 toast 吗?
- android - react native - 当初始项目“未定义不是函数(评估'reactDevTools.connectToDevTools')”时崩溃
- python - 如何在 python 中使用 web.py 处理上传的 csv 文件
- scala - 为什么scala shell中定义的类是public static
- php - 使用 Sf4 进行 Lexik JWT 身份验证:未捕获的异常:无法找到路径“/login_check”的控制器
- angular - 电子构建窗口没有全屏(workAreaSize,workArea,maximize)不起作用
- php - WooCommerce 电子邮件通知中基于产品类别的不同收件人
- java - 如何使用 Vaadin 上传图像 Java Spring 应用程序