用“std::multimap”的排序内容填充列表控件
Populating a List Control with the sorted contents of an `std::multimap`?
作为这个问题的后续,我需要一种通过索引访问数据的方法。但数据需要按时间戳排序,包含文件路径作为值,并在发现新元素时实时显示
考虑到多个文件/文件夹可能包含相同的时间戳,我决定选择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;
}
相关文章:
- 二叉排序树无法编译
- 在c++中用vector填充一个简单的动态数组
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 如何使用用户输入在C++中正确填充2D数组
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 如何找到大小'x'数组是否完全填充,在C++?
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 通过for循环使用用户输入填充列表
- 无法在基于 DFS 的任务排序程序中填充"stack"
- Cuda有效地将数据插入到未排序的填充数组中
- 冒泡排序在结构化列表中,由csv文件填充
- 用“std::multimap”的排序内容填充列表控件
- 对通过外部文件填充的数组进行不正确的排序和/或搜索