带有迭代器的 std::map 从 std::map 的迭代器到 std::list

use*_*854 5 c++ templates iterator stl

我应该如何将带有迭代器的 std::list(1) 声明为 std::map,它将 std::string 映射到 std::list (1) 的迭代器?是否可以?

std::list<std::map<std::string, (1) ???>::iterator>;
std::map<std::string, (1) ???::iterator>;
Run Code Online (Sandbox Code Playgroud)

我想要这个的原因 - FIFO 队列能够通过键快速删除。

一种可能的解决方案:

struct decl_t {
    typedef std::map< std::string, decl_t > map_t;
    typedef std::list< std::pair< int, typename map_t::iterator > > list_t;

    list_t::iterator it;
};
Run Code Online (Sandbox Code Playgroud)

小智 1

这是丑陋但完整的示例

#include <cassert>
#include <iostream>
#include <list>
#include <map>
#include <string>

struct decl_t {
    typedef std::map<std::string, decl_t> map_t;
    typedef std::list<std::pair<int, typename map_t::iterator>> list_t;

    list_t::iterator it;
};

int main(int argc, const char* argv[])
{
    decl_t::map_t map;
    decl_t::list_t list;

    auto list_it = list.emplace(list.end(), 42, decl_t::map_t::iterator());
    const auto pair = std::make_pair(std::string("key"), decl_t{list_it});
    auto result = map.insert(pair);
    assert(result.second);
    auto map_it = result.first;
    list_it->second = map_it;

    std::cout << list_it->second->first << std::endl;
    std::cout << map_it->second.it->first << std::endl;
}
Run Code Online (Sandbox Code Playgroud)