如果我正确理解了您的问题,并且为您提供了 asessionId
和 a 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);
}
这是一个活生生的例子。
更新:
编辑后,结果发现要求完全不同。如果我理解正确,给定 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 << " ";
}
}
当然还有活生生的例子。