簡體   English   中英

在地圖的地圖中查找值並返回主地圖的鍵(或替代鍵)

[英]find values in map of map & return primary map's keys (or alternative)

我正在為一個網站編寫websocket ++服務器,該網站通常只有幾頁,上面列出了文章列表,就像您在任何社交新聞網站上看到的或問題堆棧上看到的一樣; 但是,我通過人造按鈕和滑塊動態更改了顯示的文章,並通過websocket推送對其進行了更新。

當然,我需要存儲每個連接,但是我還希望該網站記住每個頁面上每個用戶的位置。 這是每個頁面上文章的索引位置。

如果我使用(偽代碼): map<sessionid, map<page, index>> ,我可以直接找到index嗎? 如果沒有,我應該使用什么代碼來實現?

如果可以,請在最少的代碼行和最高的性能之間取得平衡。

多個sessionid

抱歉,忘記了很多人可能會在page上查看相同的index ,因此它需要輸出僅sessionidset (除非有更好的東西)。

因此,在偽代碼中,它可能類似於findPageIndex(map<sessionid, map<page, index>>, page, index)並返回set<sessionid>

page

每次創建會話時,每個pageindex es將默認為0 ,直到用戶更改它們為止。

推理

這種格式的目的是在其他用戶通過投票,評論等更改文章時更新用戶。我希望將新數據立即發送回查看這些文章的客戶端。

所以:

  1. User1更新數據庫中的article1
  2. 服務器找到所有正在查看article1的用戶
  3. 服務器更新所有查看article1的用戶

這是我對堆棧和其他高級站點如何執行此操作的最佳猜測。

如果我正確理解了您的問題,並為您提供了sessionIdpage ,則可以進行嵌套搜索(在這里,我假設sessionIdpageindex都是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);
}

這是一個生動的例子


更新:

編輯之后,原來的要求大不相同。 如果我理解正確的,給定一個pageindex ,要檢索所有sessionId S表示這是有 相應內部地圖中的page-> index`關聯。 在這種情況下,算法可能如下所示:

#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!
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM