2

我正在为一个网站编写一个 websocket++ 服务器,该网站主要是几页,其中包含您在任何社交新闻网站上看到的文章列表或堆栈上的问题链接;但是,我通过人造按钮和滑块动态更改显示的文章,并使用 websocket 推送更新它们。

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

如果我使用 (psuedocode): map<sessionid, map<page, index>>,我可以index直接找到吗?如果不是,我应该使用什么代码来实现这一点?

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

多个sessionid_

抱歉,忘记了很多人可能会看同一个indexper page,所以它需要输出一个set(除非有更好的东西)只有sessionids。

因此,在伪代码中,它可能看起来像findPageIndex(map<sessionid, map<page, index>>, page, index)return set<sessionid>

pages

每次创建会话时,indexes 将默认为0for each page,直到用户更改它们。

推理

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

所以:

  1. User1 更新数据库中的 article1
  2. 服务器找到所有正在查看文章 1 的用户
  3. 服务器更新所有查看文章的用户1

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

4

2 回答 2

1

如果我正确理解了您的问题,并且为您提供了 asessionId和 a page,则您可以进行嵌套搜索(这里我假设sessionId,pageindex都是 的类型别名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);
}

这是一个活生生的例子


更新:

编辑后,结果发现要求完全不同。如果我理解正确,给定 apage和 an index,您想检索在相应的内部映射中sessionId存在 page -> index` 关联的所有 s 。在这种情况下,算法可能如下所示:

#include <map>
#include <algorithm>
#include <vector>

std::vector<int> find_sessions_by_page_and_index(
    std::map<int, std::map<int, int>> const& m,
    int page,
    int index)
{
    std::vector<int> result;
    for (auto const& p : m)
    {
        auto i = p.second.find(page);
        if ((i != p.second.end()) && (i->second == index))
        {
            result.push_back(p.first);
        }
    }

    return result;
}

这就是你将如何使用它:

#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 << " ";
    }
}

当然还有活生生的例子

于 2013-03-30T17:05:58.270 回答
0
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!
        }
    }
}
于 2013-03-30T17:39:53.347 回答