Как объявить std :: list (1) с помощью итераторов на std :: map, который сопоставляет std :: string с итераторами std :: список (1)? Является ли это возможным?std :: map с итераторами в std :: list из итераторов std :: map
std::list<std::map<std::string, (1) ???>::iterator>;
std::map<std::string, (1) ???::iterator>;
Причина, по которой я хочу это - очередь 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;
};
Связанный: http: //stackoverflow.com/questions/34470987/how-i-can-define-a-list-of-mapiterator-and-map-of-listiterator –
У вас возникают проблемы, потому что вы хотите, чтобы оба контейнера ссылались друг на друга , Нужно содержать данные, другие - ссылки (через итераторы). Если вы хотите избежать бухгалтерского учета, вы можете взглянуть на [boost.multi_index] (http://www.boost.org/doc/libs/1_60_0/libs/multi_index/doc/index.html) или [boost.bimap ] (http://www.boost.org/doc/libs/1_60_0/libs/bimap/doc/html/index.html) в зависимости от того, что лучше подходит. – stefaanv
Возможно, вам лучше сохранить структуру, которая инкапсулирует как вашу строку, так и общий дескриптор некоторого описания, которое может быть сохранено на вашей карте. Этот дескриптор может содержать логический флаг 'dontExecute', который можно установить в' true'. Таким образом, вы фактически не удаляете элемент из FIFO, но как только он достигнет фронта, вы можете просто проверить 'theElement.handle-> dontExecute' и пропустить обработку, если это необходимо. –