在地图的地图中查找值并返回主地图的键(或替代)
Posted
技术标签:
【中文标题】在地图的地图中查找值并返回主地图的键(或替代)【英文标题】:find values in map of map & return primary map's keys (or alternative) 【发布时间】:2013-03-30 16:54:15 【问题描述】:我正在为一个网站编写一个 websocket++ 服务器,该网站主要是几页,其中包含您在任何社交新闻网站上看到的文章列表或堆栈上的问题链接;但是,我通过人造按钮和滑块动态更改显示的文章,并使用 websocket 推送更新它们。
当然,我需要存储每个连接,但我还希望网站记住每个用户在每个页面上的位置。这是每页文章的索引位置。
如果我使用(伪代码):map<sessionid, map<page, index>>
,我可以直接找到index
吗?如果没有,我应该使用什么代码来实现这一点?
如果可以,请在最少代码行数和最高性能之间取得平衡。
多个sessionid
s
抱歉,忘记了很多人可能会在每个page
中查看相同的index
,所以它需要输出一个set
(除非有更好的东西),只有sessionid
s。
因此,在伪代码中,它可能看起来像 findPageIndex(map<sessionid, map<page, index>>, page, index)
并返回 set<sessionid>
。
page
s
每次创建会话时,每个page
的index
es 将默认为0
,直到用户更改它们。
推理
这种格式的目的是在其他用户通过投票、cmets 等更改文章时更新用户。我希望将新数据立即发送回查看这些文章的客户。
所以:
-
User1 更新数据库中的 article1
服务器找到所有查看文章 1 的用户
服务器会更新所有查看文章 1 的用户
这是我对堆栈和其他高级网站如何做到这一点的最佳猜测。
【问题讨论】:
“直接”是什么意思? 为什么不只使用两张地图。一个用于map<sessionid, page>
,另一个用于map<sessionid, index
> 或者将两个页面/索引都保存在“位置”结构中,以便您可以说map<sessonid, location>
?
@selbie 因为我想同时存储多个页面的信息。我正在使用 jQuery 做一个水疗中心,所以我需要始终存储所有页面的信息,以便在它们翻阅页面时快速。
@AndyProwl 可能是多余的,但我知道可以找到密钥但找不到值
所以你想返回所有sessionId
s,在映射中有一对(page, index)
与sessionId
关联?
【参考方案1】:
如果我正确理解了您的问题,并且为您提供了 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);
这是live example。
更新:
编辑后,发现要求完全不同。如果我理解正确,给定一个page
和一个index
,您想检索在相应的内部映射中有page -> index` 关联的所有
sessionId
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 << " ";
当然还有live example。
【讨论】:
感谢您的精彩回答!我可以贪心并要求您根据我的编辑进行修改吗?抱歉,我刚刚意识到我只需要sessionid
。
@JoeCoderGuy:抱歉,我没有看到您的消息通知。将检查您的编辑并更新答案
非常感谢!你的格式正是我正在寻找的。很抱歉没有从一开始就更好地组织问题。 ://
@JoeCoderGuy:我不确定我是否清楚:我知道您想返回一组sessionID
s,但您的意见是什么? index
?或者page
+ index
?
@JoeCoderGuy:很高兴我能帮上忙 :)【参考方案2】:
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!
【讨论】:
以上是关于在地图的地图中查找值并返回主地图的键(或替代)的主要内容,如果未能解决你的问题,请参考以下文章