【发布时间】:2018-01-08 15:24:35
【问题描述】:
我有一个:
std::map<long, std::wstring> fNames; // ex: fNames[FileReferenceNumber] = L"hello.txt"
由于std::map 有排序的键,但没有值(哈希表unordered_map 甚至没有排序),我想创建一个向量:
std::vector<long> v;
将包含键允许fNames 的迭代按值排序。
例子:如果我们有
9187 => "hello.txt"
13 => “z.txt”
第1777章
那么v 将是:[1777, 9187, 13],允许迭代 fNames 按值排序:
for (int i = 0; i < v.size(); i++)
wcout << fNames[v[i]]; // a.txt, hello.txt, z.txt
有没有办法使用std::sort 创建这个向量v?我不明白怎么做。我应该使用自定义谓词吗?
PS:更好的是:是否可以生成一个已排序的std::vector<wstring> w?即每个元素w[0]、w[1] 等都将包含指向fNames 的 wstrings 的“链接”(指针?),但不包含副本(以避免复制字符串数据)?
或者可能是std::vector<wchar_t *> w?
【问题讨论】:
-
第二个
multimap<wstring, long>,它将存储排序后的值及其键。在每次更改原始map<long, wstring>时创建和排序vector<wstring>值将花费太多时间。 -
@ikleschenkov 是否类似于拥有地图 + 它的“反向地图”?如果多个键具有相同的值会发生什么?假设
a[1] = "blah"; a[2] = "blah";反向映射reversea["blah"]是什么?如问题中所述,是否可能只有一个用于排序的向量? -
multimap将处理重复的“键”(这是来自第一个映射的值)。解决方案取决于您需要多久刷新一次排序值的向量。如果你很少需要这个,那么排序vector就可以了。如果你经常需要这个,那么最好“反转”multimap,因为它会比每次更新和排序向量更快。
标签: c++ sorting dictionary vector