映射为数组的问题

时间:2011-04-20 12:00:51

标签: c++ std

美好的一天!

我用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]'|
你能帮帮我吗?

提前致谢。

4 个答案:

答案 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)

oldStatesymbol有哪些类型?

从我对你的问题的理解,我怀疑这种类型 transitionTable应该是:

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

至少,这会给出映射:(set_of_states, char) -> set_of_states,如果在您的示例中使用,oldState是 一组状态,symbolchar