You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现用户对嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:47:32