2010-06-10 95 views
1

声明地图早就:显示地图STL

map<char*,char*> rtable; // used to store routing information 

现在我试图显示在地图的内容:

void Routes::viewroutes(){ 
    typedef map<char*, char*>::const_iterator iter; 
    for (iter=rtable.begin(); iter != rtable.end(); ++iter) { 
     cout << iter->second << " " << iter->first << endl; 
    } 
} 

收到错误“预期主表达式前“! ='标记和' - >'标记。似乎无法理解我在这里创建的错误。任何想法?

+1

请注意,作为映射键的'char *'不能完成大多数初学者所期望的操作。 std :: map 排序后的默认比较将按照它们的地址对关键字__进行排序,而不是根据它们的值进行排序。 “blah”和“blah”比较是否相等,取决于编译器是否折叠相同的字符串文字 - 这是许多编译器的优化设置。通常你想使用'std :: string'而不是'char *'。 – sbi 2010-06-10 20:11:22

+0

那和内存问题。 char *是可憎的。 – 2010-06-10 20:13:27

+0

sbi - 我很欣赏评论。我刚开始尝试弄清楚为什么我的地图没有按预期排序。 – BSchlinker 2010-06-10 20:52:40

回答

4

iter是您的代码中的一种类型。应该是一个变量。

typedef map<char*,char*> my_map_t; // alias for a specialized map 

// declare a variable of needed type 
my_map_t rtable; 

// declare iter of type my_map_t::const_iterator 
for (my_map_t::const_iterator iter=rtable.begin(); iter != rtable.end(); ++iter) { 
    cout << iter->second << " " << iter->first << endl; 
} 
// scope of the iter variable will be limited to the loop above 
+0

保留typedef只是有点复杂,你不觉得吗? – 2010-06-10 19:55:50

+2

每次写一个完整类型的迭代器都不太方便。 typedef使生活更轻松。 – 2010-06-10 19:58:21

1

删除typedef。您没有用该语句声明变量,定义一个类型然后分配给它。这就是错误所在。

+0

然后typedef的要点是什么?它出现在我有的示例代码中。 – BSchlinker 2010-06-10 19:57:02

+0

typedef可以为您节省一些键入内容,但不是您拥有它的位置。如果您想使用它,请在声明地图的位置定义它。但给它一个看起来像一个类型的名称,而不是一个变量。例如: typedef map :: const_iterator MapCIter; – bshields 2010-06-10 20:02:08

-4

我一直访问我的地图迭代器像这样(* ITER)。首先和(* ITER)。第二。

+4

为什么?有什么反对 - >运营商? – 2010-06-10 19:55:18

+0

哎哟,人们真的不喜欢我的回答。 :-) 不,不,我没有任何反对operator - >()的东西。这就是我在一天中学会的方式,而且我从未改变过。习惯的生物和所有那些。 – 2010-06-11 01:23:38

1

声明iter类型的变量:

void Routes::viewroutes(){ 
    typedef map<char*, char*>::const_iterator iter; 
    for (iter i =rtable.begin(); i != rtable.end(); ++i) { 
     cout << i->second << " " << i->first << endl; 
    } 
} 

只是为了好玩:),你可以使用我写的流地图的内容或多重映射到任何标准的流以下功能无论是标准输出,文件流。它处理所有类型的流如cout或wcout,例如:

template <class Container, class Stream> 
    Stream& printPairValueContainer(Stream& outputstream, const Container& container) 
    { 
     typename Container::const_iterator beg = container.begin(); 

     outputstream << "["; 

     while(beg != container.end()) 
     { 
      outputstream << " " << "<" << beg->first << " , " << beg->second << ">"; 
      beg++; 
     } 

     outputstream << " ]"; 

     return outputstream; 
    } 

template 
    < class Key, class Value 
    , template<class KeyType, class ValueType, class Traits = std::less<KeyType>, 
    class Allocator = std::allocator<std::pair<const KeyType, ValueType> > > 
    class Container 
    , class Stream 
    > 
Stream& operator<<(Stream& outputstream, const Container<Key, Value>& container) 
{ 
    return printPairValueContainer(outputstream, container); 
}