我正在为一个网站写一个websocket++服务器,这个网站主要是几个页面的文章列表,就像你在任何社会新闻网站上看到的那样,或者是堆栈上的问题链接;但是,我通过人造按钮和滑块动态更改显示的文章,并使用websocket推送更新它们。
当然,我需要存储每个连接,但我也希望站点记住每个用户在每个页面上的位置。这是每页文章的索引位置。如果我使用(psuedocode): map<sessionid, map<page, index>>
,我可以直接找到index
吗?如果没有,我应该使用什么代码来实现这一点?
如果可以的话,请在最少的代码行数之间保持平衡&马克斯性能。
multiple sessionid
s
对不起,忘记了许多人可能会看到每个page
相同的index
,所以它需要输出set
(除非有更好的东西)只有sessionid
s。
因此,在伪代码中,它可能看起来像findPageIndex(map<sessionid, map<page, index>>, page, index)
,并返回set<sessionid>
。
page
s
每次创建会话时,index
将默认为每个page
的0
,直到用户更改它们。
此格式的目的是在其他用户通过投票、评论等方式更改文章时更新用户。我希望新数据立即发送回客户端查看这些文章。
:
- User1更新数据库中的article1
- 服务器发现所有用户都在查看文章1
- 服务器更新查看文章1的所有用户
这是我对stack和其他高级站点如何做到这一点的最好猜测。
如果我正确理解你的问题,并且提供sessionId
和page
,你可以只是做一个嵌套搜索(这里我假设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);
}
下面是一个实例
更新:
编辑后,发现需求有很大的不同。如果我理解正确的话,给定一个page
和一个index
,您想要检索在相应的内部映射中存在页->索引关联的所有
sessionId
。在这种情况下,算法看起来像这样:
#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 << " ";
}
}
当然还有实际的例子
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!
}
}
}