如何实现用户对嵌套std::map/std::set容器的反向逐个循环迭代
双向迭代器反向遍历至首个元素的实现
根据社区建议,重新发布更新后的问题。
类型别名定义
using SuggestedPublishersSet = std::set<CString>; using SuggestedPublishersSetIter = SuggestedPublishersSet::iterator; using SuggestedPublishersMap = std::map<long, SuggestedPublishersSet>; using SuggestedPublishersMapIter = SuggestedPublishersMap::iterator;
类数据成员
SuggestedPublishersMap m_mapSuggestedPublishers; SuggestedPublishersMapIter m_mapSuggestedPublishersIter; SuggestedPublishersSetIter m_setSuggestedPublishersIter;
现有正向迭代功能
该类用于对话框,已实现按钮点击时的正向循环迭代逻辑:
- 首次点击:构建容器并选中第一个名称;
- 后续点击:每次向前移动一个名称;
- 到达末尾后:重置为第一个名称,形成循环。
对应的正向迭代实现代码:
void CDemoPickerDlg::OnBnClickedButtonSuggest() { if (m_mapSuggestedPublishers.empty()) { // 构建map - 代码省略 // 初始化迭代器并选中第一个推荐名称 m_mapSuggestedPublishersIter = m_mapSuggestedPublishers.begin(); m_setSuggestedPublishersIter = m_mapSuggestedPublishersIter->second.begin(); } else { // 查找下一个推荐名称(若存在) while (m_mapSuggestedPublishersIter != m_mapSuggestedPublishers.end()) { // 是否到达当前set的末尾? if (m_setSuggestedPublishersIter == m_mapSuggestedPublishersIter->second.end()) { // 是,移动到下一个日期并初始化新迭代器 m_mapSuggestedPublishersIter++; // 是否到达map末尾? if (m_mapSuggestedPublishersIter == m_mapSuggestedPublishers.end()) { // 重置迭代器并选中第一个推荐名称 m_mapSuggestedPublishersIter = m_mapSuggestedPublishers.begin(); m_setSuggestedPublishersIter = m_mapSuggestedPublishersIter->second.begin(); } else { // 从下一个日期的第一个名称开始 m_setSuggestedPublishersIter = m_mapSuggestedPublishersIter->second.begin(); } break; } else { // 移动到下一个名称 m_setSuggestedPublishersIter++; // 是否到达当前set的最后一个名称? if (m_setSuggestedPublishersIter == m_mapSuggestedPublishersIter->second.end()) { // 是,移动到下一个日期并初始化新迭代器 m_mapSuggestedPublishersIter++; // 是否到达map末尾? if (m_mapSuggestedPublishersIter == m_mapSuggestedPublishers.end()) { // 重置迭代器并选中第一个推荐名称 m_mapSuggestedPublishersIter = m_mapSuggestedPublishers.begin(); m_setSuggestedPublishersIter = m_mapSuggestedPublishersIter->second.begin(); } else { // 从下一个日期的第一个名称开始 m_setSuggestedPublishersIter = m_mapSuggestedPublishersIter->second.begin(); } } break; } } } // 获取下一个要使用的发布商 const auto& strNextPublisher = m_setSuggestedPublishersIter->GetString(); // 遍历网格查找该发布商 - 代码省略 }
需求
已掌握按键检测方法,希望添加功能:当用户点击按钮时若检测到CTRL键按下,实现反向逐个迭代容器,逻辑与正向一致(到达起始点后反向循环)。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

