美好的一天!
我用c ++制作非确定性有限自动机。我想制作一个转换表。如你所知,它应该返回一组状态。例如,table [state] [symbol]应该返回{q0,q1等等}。
我正在使用std :: map和std :: set。我找到了这个有用的例子:how to use stl::map as two dimension array
所以,我写了一些代码:
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]'|
你能帮帮我吗?
提前致谢。
答案 0 :(得分:0)
根据您的描述,您可能会想要(typedef
s的可读性):
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
。
答案 1 :(得分:0)
我认为oldState
是一个集合。如果是这种情况,transitionTable[oldState]
会返回一张地图,如果符号不是一个集合,则transitionTable[oldState][symbol]
无效,因此会出错。
答案 2 :(得分:0)
std::map <set<state>, std::map<state,char> > transitionTable;
您有设置作为地图中的关键字,而不是状态。
答案 3 :(得分:0)
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
。