作为this question的后续行动,我需要一种通过索引访问我的数据的方法。但是数据需要按时间戳排序,包含文件路径作为值,并在发现新元素时实时显示。
考虑到多个文件/文件夹可能包含相同的时间戳,我决定使用std::multimap
作为存储数据的首选容器。但是,这会填充我的列表控件的过程变得复杂,因为LVITEM::iItem
是一个索引值,用于确定在设置了LVS_OWNERDATA
标志的控件中显示哪个数据元素(即{{1}} 3}})。
我似乎找不到通过索引访问我的数据的方法,以获得时间戳键和&文件路径值,那么我该怎么做才能解决这个问题?
答案 0 :(得分:1)
您无法直接通过索引访问std::multimap
的内容。但您可以做的是将已排序的数据存储在std::multimap
中,然后将iterator
值存储在单独的std::vector
中,并将其用作ListView的数据源。当ListView按索引要求数据时,请转到std::vector
并使用指定索引处的iterator
访问std::multimap
中的数据。当您在insert()
中std::multimap()
新项目时,它会为该项目返回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;
}