用“std::multimap”的排序内容填充列表控件

Populating a List Control with the sorted contents of an `std::multimap`?

本文关键字:填充 排序 列表 控件 std multimap      更新时间:2023-10-16

作为这个问题的后续,我需要一种通过索引访问数据的方法。但数据需要按时间戳排序,包含文件路径作为值,并在发现新元素时实时显示

考虑到多个文件/文件夹可能包含相同的时间戳,我决定选择std::multimap作为存储数据的容器。然而,这使填充我的列表控件的过程变得复杂,因为LVITEM::iItem是一个索引值,用于确定在设置了LVS_OWNERDATA标志的控件(即虚拟列表(中显示哪个数据元素。

我似乎找不到一种通过索引访问数据的方法来获得时间戳键&filepath值,那么我该怎么做才能纠正这个问题呢?

不能通过索引直接访问std::multimap的内容。但是,您可以将排序后的数据存储在std::multimap中,然后将iterator值存储在单独的std::vector中,并将其用作ListView的数据源。当ListView要求按索引提供数据时,转到您的std::vector并使用指定索引处的iterator访问std::multimap中的数据。当您在std::multimap()insert()一个新项目时,它会为该项目返回一个iterator,并且现有的iterator不会因插入而无效。

std::multimap<MyItemData> mydata;
std::vector<std::multimap<MyItemData>::iterator> lvdata;
...
std::multimap<MyItemData>::iterator iter = mydata.insert(...);
lvdata.push_back(iter);
SendMessage(hwndLV, LVM_SETITEMCOUNT, lvdata.size(), LVSICF_NOINVALIDATEALL | LVSICF_NOSCROLL);
...
case LVN_GETDISPINFO:
{
    NMLVDISPINFO *pdi = reinterpret_cast<NMLVDISPINFO*>(lParam);
    std::multimap<MyItemData>::iterator iter = lvdata[pdi->item.iItem];
    // use *iter as needed...
    break;
}