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