Проблемы с картой как массивом

Добрый день!

Я делаю недетерминированные конечные автоматы с С++. Я хочу сделать таблицу переходов. Как вы знаете, он должен возвращать набор состояний. Например, таблица[состояние][символ] должна возвращать {q0,q1 и т. д.}.

Я использую для этого std::map и std::set. Я нашел этот полезный пример: как использовать stl::map как двухмерный массив

Итак, я написал код:

std::map <set<state>, std::map<state,char> > transitionTable;

Но когда я пытаюсь получить доступ к таблице, например

set<state> result = transitionTable[oldState][symbol];

Я получаю сообщение об ошибке:

C:\NFA2\main.cpp||In function 'std::set<state, std::less<state>, std::allocator<state> > delta(state, char)':|
C:\NFA2\main.cpp|17|error: no match for 'operator[]' in 'transitionTable[oldState]'|

Вы можете помочь мне?

Заранее спасибо.


person Alexey Kalmykov    schedule 20.04.2011    source источник
comment
Пожалуйста, не редактируйте свои вопросы таким образом, чтобы сделать недействительными все данные ответы. Вместо этого вы можете добавить дополнительную информацию, если у вас есть дополнительные проблемы.   -  person Georg Fritzsche    schedule 20.04.2011


Ответы (4)


Судя по вашему описанию, вы хотите (typedefs для удобочитаемости):

typedef std::set<state> StateSet;
typedef std::map<char, StateSet> SymbolToStatesMap;
typedef std::map<state, SymbolToStatesMap> TransitionTable;

TransitionTable transitionTable;

Имейте в виду, что аргумент первого типа для map является типом ключа, поэтому, если вам нужен такой доступ:

A a;
B b;
C c = myMap[a][b];

тип карты должен быть:

std::map<A, std::map<B, C> >

Чтобы на самом деле иметь возможность использовать пользовательские типы в качестве ключа на карте, они должны реализовать operator<:

class state {
    // ...
public:
    bool operator<(const state& rhs) const {
        // ... custom stuff here
    }

В качестве альтернативы вы можете передать пользовательский компаратор в map.

person Georg Fritzsche    schedule 20.04.2011
comment
Спасибо. Но теперь после этого изменения есть другая ошибка: c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_function.h|230|error: no match for 'operator<' in '__x < __y'| - person Alexey Kalmykov; 20.04.2011
comment
@Skyrocker: я думаю, state - это настраиваемый тип, и у вас нет operator< для него? - person Georg Fritzsche; 20.04.2011
comment
Да, это мой тип, но мне не нужно никакого сравнения с ним. Но состояние - это структура только с одним полем string, поэтому, возможно, я могу использовать строку вместо моего struct state. - person Alexey Kalmykov; 20.04.2011
comment
Я использовал string вместо state, и это работает. Большое спасибо! - person Alexey Kalmykov; 20.04.2011
comment
@Sky: см. редактирование о том, как использовать пользовательские типы в качестве ключа на карте. - person Georg Fritzsche; 20.04.2011

Я предполагаю, что oldState - это набор. Если это так, transitionTable[oldState] возвращает вам карту, а transitionTable[oldState][symbol] недействителен, если символ не является набором и, следовательно, ошибка.

person mukeshkumar    schedule 20.04.2011
comment
Нет, oldState — это одно состояние, а не множество. - person Alexey Kalmykov; 20.04.2011

std::map <set<state>, std::map<state,char> > transitionTable;

У вас есть набор как ключ на карте, а не состояние.

person murrekatt    schedule 20.04.2011

Какие бывают типы oldState и symbol?

Насколько я понимаю вашу проблему, я подозреваю, что тип transitionTable должен быть:

std::map<std::set<state>, std::map<char,std::set<state> > transitionTable;

По крайней мере, это даст отображение: (set_of_states, char) -> set_of_states, если использовать его, как в вашем примере, где oldState — это набор состояний, а symbol — это char.

person James Kanze    schedule 20.04.2011