【问题标题】:Problems with map as array地图作为数组的问题
【发布时间】:2011-04-20 12:00:51
【问题描述】:

美好的一天!

我正在用 C++ 制作非确定性有限自动机。我想做一个转换表。如您所知,它应该返回一组状态。例如,table[state][symbol] 应该返回 {q0,q1, etc..}。

我为此使用了 std::map 和 std::set。我发现了这个有用的例子:how to use stl::map as two dimension array

所以,我写了一些代码:

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

但是当我试图像这样访问表格时

set&lt;state&gt; 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]'|

你能帮帮我吗?

提前致谢。

【问题讨论】:

  • 请不要以使所有给定答案无效的方式编辑您的问题。如果您有更多问题,您可以添加其他信息。

标签: c++ std


【解决方案1】:

从您的描述看来,这听起来像是您想要的(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&lt;

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

或者,您可以将自定义比较器传递给map

【讨论】:

  • 谢谢。但是现在更改后出现另一个错误:c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_function.h|230|error: no match for 'operator&lt;' in '__x &lt; __y'|
  • @Skyrocker:我猜state 是一个自定义类型,而你没有为它实现operator&lt;
  • 是的,这是我的类型,但我不需要任何比较。但是状态是一个只有一个string 字段的结构,所以我可以使用字符串而不是我的struct state
  • 我用string 代替state 并且它有效。非常感谢!
  • @Sky:请参阅编辑以了解如何使用自定义类型作为地图中的键。
【解决方案2】:

我假设oldState 是一个集合。如果是这种情况,transitionTable[oldState] 会返回一个地图,如果 symbol 不是一个集合,transitionTable[oldState][symbol] 则无效,因此会出错。

【讨论】:

  • 不,oldState 是一个状态,而不是一个集合。
【解决方案3】:
std::map <set<state>, std::map<state,char> > transitionTable;

您有一个 set 作为地图中的键,而不是状态。

【讨论】:

    【解决方案4】:

    oldStatesymbol的类型有哪些?

    根据我对您的问题的了解,我怀疑类型 transitionTable 应该是:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多