Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在地图的地图中查找值&;返回主映射';s键(或备选)_C++_Map_Websocket_Find_Key Value - Fatal编程技术网

C++ 在地图的地图中查找值&;返回主映射';s键(或备选)

C++ 在地图的地图中查找值&;返回主映射';s键(或备选),c++,map,websocket,find,key-value,C++,Map,Websocket,Find,Key Value,我正在为一个网站编写一个websocket++服务器,这个网站的大部分页面都有文章列表,就像你在任何社交新闻网站或stack上的问题链接上看到的那样;但是,我通过人造按钮和滑块动态更改显示的文章,并使用websocket按钮更新它们 当然,我需要存储每个连接,但我也希望站点记住每个用户在每个页面上的位置。这是每页文章的索引位置 如果我使用(psuedocode):map,我可以直接找到索引吗?如果没有,我应该使用什么代码来实现这一点 如果可以,请在最少的代码行和最大的性能之间取得平衡 多个ses

我正在为一个网站编写一个websocket++服务器,这个网站的大部分页面都有文章列表,就像你在任何社交新闻网站或stack上的问题链接上看到的那样;但是,我通过人造按钮和滑块动态更改显示的文章,并使用websocket按钮更新它们

当然,我需要存储每个连接,但我也希望站点记住每个用户在每个页面上的位置。这是每页文章的索引位置

如果我使用(psuedocode):
map
,我可以直接找到
索引吗?如果没有,我应该使用什么代码来实现这一点

如果可以,请在最少的代码行和最大的性能之间取得平衡

多个
sessionid
s

抱歉,忘记了很多人可能会在每个
页面上查看相同的
索引
,因此它需要只输出
会话ID的
(除非有更好的设置)

因此,在伪代码中,它可能看起来像
findPageIndex(map,page,index)
并返回
set

页面
s

每次创建会话时,每个
页面的
索引将默认为
0
,直到用户更改它们

推理

此格式的目的是在其他用户通过投票、评论等更改文章时更新用户。我希望新数据立即发送回查看这些文章的客户

因此:

  • User1更新数据库中的article1
  • 服务器找到所有查看第1条的用户
  • 服务器更新所有查看article1的用户

  • 这是我对stack和其他高级站点如何做到这一点的最佳猜测。

    如果我正确理解了您的问题,并且为您提供了
    会话ID
    页面,您可以进行嵌套搜索(这里我假设
    sessionId
    page
    index
    都是
    int
    的类型别名,但情况显然并非如此)

    在C++11中,您可以这样做:

    #include <map>
    #include <algorithm>
    #include <stdexcept>
    
    int find_index(
        std::map<int, std::map<int, int>> const& m,
        int sessionId,
        int pageId)
    {
        auto i = m.find(sessionId);
        if (i != m.end())
        {
            auto j = i->second.find(pageId);
            if (j != i->second.end())
            {
                return j->first;
            }
        }
    
        throw std::logic_error("Invalid coordinates");
    }
    
    以下是您将如何使用它:

    #include <iostream>
    
    int main()
    {
        std::map<int, std::map<int, int>> m;
        m[42] = std::map<int, int>{{1729, 6}};
    
        std::cout << find_index(m, 42, 1729);
    }
    
    #include <iostream>
    
    int main()
    {
        std::map<int, std::map<int, int>> m;
        m[42] = std::map<int, int>{{1729, 6}};
        m[24] = std::map<int, int>{{1729, 6}};
        m[5] = std::map<int, int>{{1729, 12}};
        m[10] = std::map<int, int>{{9271, 6}};
    
        auto v = find_sessions_by_page_and_index(m, 1729, 6);
        for (auto x : v)
        {
            std::cout << x << " ";
        }
    }
    
    #包括
    int main()
    {
    std::map m;
    m[42]=std::map{{1729,6};
    m[24]=std::map{{1729,6};
    m[5]=std::map{{1729,12};
    m[10]=std::map{{9271,6};
    自动v=按页面和索引查找会话(m,1729,6);
    用于(自动x:v)
    {
    std::cout
    typedef映射页\映射;
    typedef映射ses_映射;
    ses\u map\u map;//主映射
    index\u-wanted;//您正在查找的索引。
    for(ses_map::迭代器ses_it=seu map.begin();ses_it!=seu map.end();+ses_it){
    对于(page_map::iterator page_iter=ses_it->second.begin();page_iter!=ses_it->second.end();++page_iter){
    如果(需要索引==第二页){
    //找到了!
    }
    }
    }
    
    你所说的“直接”是什么意思?为什么不使用两个地图呢?一个用于
    map
    ,另一个用于
    map,或者将两个页面/索引保留在一个“位置”结构,这样您就可以说
    map
    ?@selbie,因为我想同时存储多个页面的信息。我使用jQuery进行spa,所以我需要在页面翻转时随时存储所有页面的信息以加快速度。@AndyProwl可能是多余的,但我知道可以找到键,但无法找到值,所以您需要重新设置打开有一对会话ID的所有会话ID(第页,索引)
    在与该
    会话ID相关联的地图中
    ?谢谢你的回答!我可以贪婪地要求你根据我的编辑进行修改吗?对不起,我刚刚意识到我需要的只是
    会话ID
    @JoeCoderGuy:对不起,我没有看到你的消息通知。我会检查你的编辑并更新答案谢谢你非常感谢!你的格式正是我想要的。很抱歉没有从一开始就更好地组织这个问题。//@JoeCoderGuy:我不确定我是否清楚:我知道你想返回一组
    sessionID
    ,但是你的输入是什么呢?
    索引
    ?或者
    页面
    +索引
    ?@JoeCoderGuy:Glad我可以帮忙:)
    #include <iostream>
    
    int main()
    {
        std::map<int, std::map<int, int>> m;
        m[42] = std::map<int, int>{{1729, 6}};
        m[24] = std::map<int, int>{{1729, 6}};
        m[5] = std::map<int, int>{{1729, 12}};
        m[10] = std::map<int, int>{{9271, 6}};
    
        auto v = find_sessions_by_page_and_index(m, 1729, 6);
        for (auto x : v)
        {
            std::cout << x << " ";
        }
    }
    
    typedef map<page, index> page_map;
    typedef map<sessionid, page_map> ses_map;
    
    ses_map the_map; // The main map
    index index_wanted;  // The index you are looking for.
    
    for(ses_map::iterator ses_it = the_map.begin(); ses_it != the_map.end(); ++ses_it) {
        for(page_map::iterator page_iter = ses_it->second.begin(); page_iter != ses_it->second.end(); ++page_iter) {
            if(index_wanted == page_iter->second) {
                // Found it!
            }
        }
    }