使用 `std::multimap` 的排序内容填充列表控件?
Populating a List Control with the sorted contents of an `std::multimap`?
作为 的后续行动,我需要一种通过索引访问数据的方法。但数据需要按时间戳排序,包含文件路径作为值,并在发现新元素时实时显示。
考虑到多个 files/folders 可能包含相同的时间戳,我决定使用 std::multimap
作为存储数据的首选容器。但是,这使填充我的列表控件的过程变得复杂,因为 LVITEM::iItem
是一个索引值,用于确定要在设置了 LVS_OWNERDATA
标志的控件中显示哪个数据元素(即 virtual lists).
我似乎找不到通过索引访问我的数据以获取时间戳键和文件路径值的方法,那么我该怎么做才能更正此问题?
您无法通过索引直接访问 std::multimap
的内容。但是您可以做的是将已排序的数据存储在 std::multimap
中,然后将 iterator
值存储在单独的 std::vector
中,并将其用作 ListView 的数据源。当 ListView 按索引请求数据时,转到您的 std::vector
并使用指定索引处的 iterator
访问 std::multimap
中的数据。当您 insert()
在 std::multimap()
中添加新项目时,它 returns 为该项目添加 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;
}
作为
考虑到多个 files/folders 可能包含相同的时间戳,我决定使用 std::multimap
作为存储数据的首选容器。但是,这使填充我的列表控件的过程变得复杂,因为 LVITEM::iItem
是一个索引值,用于确定要在设置了 LVS_OWNERDATA
标志的控件中显示哪个数据元素(即 virtual lists).
我似乎找不到通过索引访问我的数据以获取时间戳键和文件路径值的方法,那么我该怎么做才能更正此问题?
您无法通过索引直接访问 std::multimap
的内容。但是您可以做的是将已排序的数据存储在 std::multimap
中,然后将 iterator
值存储在单独的 std::vector
中,并将其用作 ListView 的数据源。当 ListView 按索引请求数据时,转到您的 std::vector
并使用指定索引处的 iterator
访问 std::multimap
中的数据。当您 insert()
在 std::multimap()
中添加新项目时,它 returns 为该项目添加 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;
}