【问题标题】:Displaying a `std::map`显示一个`std::map`
【发布时间】:2010-06-10 19:50:10
【问题描述】:

很早就宣布了地图:

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;
    }
}

在 '!=' 标记和 '->' 标记之前收到错误“预期的主表达式。似乎无法理解我在这里犯的错误。有什么想法吗?

【问题讨论】:

  • 请注意,char* 作为映射键并不符合大多数初学者的预期。默认比较(对std::map&lt;char*,char*&gt; 进行排序)将根据它们的地址,而不是根据它们的值对键进行排序。 "blah""blah" 是否比较相等,取决于编译器是否折叠相同的字符串文字 - 许多编译器的优化设置。通常你想使用std::string 而不是char*
  • 那和内存问题。 char* 是可憎的。
  • sbi -- 我很欣赏你的评论。我刚刚开始尝试找出为什么我的地图没有按预期排序。
  • (在 cmets 中回复时请正确@address,否则它不会出现在我们的回复中,我们也永远不会看到您的回复。)只需使用std::string 处理所有与字符串相关的内容并执行远离 C 的字符数组。它更容易,更不容易出错,它很少会导致显着的性能损失,即使这样做,您仍然可以准时回退到字符数组。

标签: c++ dictionary std stdmap c++-standard-library


【解决方案1】:

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

【讨论】:

  • 保留 typedef 有点复杂,你不觉得吗?
  • 每次都写一个完整类型的迭代器不是很方便。 typedef 让生活更轻松。
【解决方案2】:

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

【讨论】:

  • 那么 typedef 的意义何在?它出现在我的示例代码中。
  • typedef 可以为您节省一些打字时间,但不能节省您的打字时间。如果你想使用它,在你声明你的地图的地方定义它。但是给它一个看起来像类型而不是变量的名称。类似于: typedef map::const_iterator MapCIter;
【解决方案3】:

声明一个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);
}

【讨论】:

    【解决方案4】:

    我总是像 (*iter).first 和 (*iter).second 那样访问我的地图迭代器。

    【讨论】:

    • 为什么?对 -> 运算符有意见吗?
    • 哎呀,人们真的不喜欢我的回答。 :-) 不,不,我对 operator->() 没有任何反对意见。这就是我在过去学到的方式,而且我从未改变过。习惯的创造物等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多