我正在尝试用几天来模拟非确定性有限自动机,使用我正在存储状态转换的地图,完全按照post中所示。
问题是他们缺少不确定性的过渡,即那些用相同符号引导我到不同状态的过渡。这是我的代码:
#include <iostream>
#include <map>
#include <utility>
#include <iterator> // for ostream_iterator
using namespace std;
int main (){
freopen ("testMap.in", "r", stdin);
int testCases;
int i, j;
int stateOrigin, stateDestination;
char transitionCharacter ;
int numberTransitions=8;
typedef map<pair<int, char>, int> transitions;
transitions trans;
for (j=0; j<numberTransitions;j++){
cin>> stateOrigin>>stateDestination>>transitionCharacter;
trans.insert(transitions::value_type(std::make_pair(stateOrigin,transitionCharacter), stateDestination ));
}
map<pair<int, char>, int>::iterator p = trans.begin();
for( p = trans.begin(); p != trans.end(); p++ ){
cout << p->first.first<< " "<<p->first.second<<" "<<p->second<<endl;
}
return 0;
}
当我打印地图的全部内容时,请告诉我:
0 a 0
1 b 1
1 c 2
3 d 4
4 d 4
,预期输出为:
0 0 a
0 1 a
1 1 b
1 2 c
1 3 c
3 4 d
4 4 d
4 5 d
我做错了什么。在另一个问题中,回答说模拟非确定性有限自动机的转换的最好方法是使用map,但是使用map是适合这种类型的问题还是可以以任何方式解决?为什么这些价值会丢失?
更改地图结构很方便吗?即:
typedef map<pair<int, int>, char> transitions;
答案 0 :(得分:2)
地图是键和值之间的1-to-1
关系,因此它可以表示确定性自动机。
非确定性自动机可以由1-to-many
关联容器表示。
即。您需要std::multimap
,或者您可以继续使用价值类型为不同容器的std::map
:
typedef map<pair<int, int>, vector<char> > transitions;
因此,每个char
对可以有多个int
值。
答案 1 :(得分:1)
您可以使用typedef,这是合法的。
在std :: map中,键必须是唯一的,因此我猜你有一些相同的对值。在这些情况下,请尝试使用std :: multimap,因为它可以在其中存储多个键控值。
编辑:好的,问题是:
map<pair<int, char>, int>::iterator p = trans.begin();
你有一双。你希望看到:
0 0 a
0 1 a
但是键是:(0,a)和(0,a)因此地图忽略了一个。
您可以通过将地图设置为:(更改int和char order)
来避免这种情况typedef map<pair<int, int>, char> transitions;
答案 2 :(得分:0)
由于地图是一对,因此您的插入内容始终在寻找一对&lt;&gt;,因为地图中的第一个元素是一对,请尝试此代码
trans.insert(std::make_pair(std::make_pair(stateOrigin,transitionCharacter), stateDestination ));