c ++存储在地图中时丢失的元素

时间:2012-05-16 06:21:50

标签: c++ stl map dfa

我正在尝试用几天来模拟非确定性有限自动机,使用我正在存储状态转换的地图,完全按照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;

3 个答案:

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